bugfix> java > 投稿

単純なRESTサービスとそのクライアントを作成しています。ある種のセキュリティを作成しようとするので、/ loginサイトにアクセスしたときにUUIDを生成します。

@RequestMapping("/login")
public uuid getUUID()
{
    temp = new uuid();
    return temp;
}

次に、クライアント側でこのUUIDを取得します。次に、このUUIDを次のようなサービス「getPerson」に渡します。

@RequestMapping("/{userId}/getperson")
public Person getPerson(@PathVariable("userId") int user, uuid uuid)
{
    if(System.currentTimeMillis() - uuid.getDate().getTime() < 60000 &&
            uuid.getHash().toString().equals(temp.toString()))
        return personService.getPerson(user);
    else
        return null;
}

私が達成したかったのは、タイムスタンプと文字列を以前に作成した一時オブジェクトと比較することによるUUIDの簡単な検証です。そして、ここに私の問題があります-クライアントからオブジェクトuuidを渡す方法がわかりません。 私の非常に洗練されたクライアントは次のようになります。

RestTemplate restTemplate = new RestTemplate();
uuid myUUID = restTemplate.getForObject("http://localhost:8080/login", uuid.class);
HttpEntity<uuid> requestUUID = new HttpEntity<uuid>(myUUID);
//HttpEntity<Person> request = new HttpEntity<Person>(new Person("John", "Great", 2));
//restTemplate.postForObject("http://localhost:8080/addperson", request, Person.class);
Person person = restTemplate.postForObject("http://localhost:8080/2/getperson", requestUUID, Person.class);

このタイプの検証が安全かどうかはわかりませんが、オブジェクトを渡す方法を教えていただければ幸いです。

回答 1 件
  • 私は以下の簡単な解決策を見つけました、

    以下に示した概念です

    import java.util.UUID;
    public class Person {
    private UUID uuid;
    public Person() {
    }
    public Person(UUID uuid) {
        super();
        this.uuid = uuid;
    }
    public UUID getUuid() {
        return uuid;
    }
    public void setUuid(UUID uuid) {
        this.uuid = uuid;
    }
    @Override
    public String toString() {
        return "Person [uuid=" + uuid + "]";
    }
    }
    
    

    コントローラIWebExample インターフェース:

    import java.util.UUID;
    import org.springframework.http.MediaType;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;
    public interface IWebExample {
    @RequestMapping(value = "/login", method = RequestMethod.GET)
    @ResponseBody
    UUID getUUID();
    @RequestMapping(value = "/{userId}/getPerson", method = RequestMethod.POST)
    @ResponseBody
    Person getPerson(int userId, UUID uuid);
    }
    
    

    コントローラーの実装

    import java.util.UUID;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestBody;
    import com.finvendor.serverwebapi.resources.example.IWebExample;
    import com.finvendor.serverwebapi.resources.example.Person;
    @Controller
    public class WebExampleImpl implements IWebExample {
    @Override
    public UUID getUUID() {
        return UUID.randomUUID();
    }
    @Override
    public Person getPerson(@PathVariable("userId") int userId, @RequestBody UUID uuid) {
        return new Person(uuid);
    }
    }
    
    

    クライアントコード:

    import java.util.UUID;
    import org.springframework.web.client.RestTemplate;
    public class ClientMainApp {
    
    public static void main(String[] args) {
        RestTemplate template=new RestTemplate();
        UUID uuid = template.getForObject("http://localhost:8080/mylogin",UUID.class);
        System.out.println("UUID="+uuid);
        //here i am passing uuid object (as per your requirement)
        Person person = template.postForObject("http://localhost:8080/1/getPerson", uuid, Person.class);
        System.out.println(person);
    }
    }
    
    

    実行するステップ

    -warファイルの作成

    -Tomcatにデプロイし、

    -クライアントコードを実行する

    出力は次のようになります。

    UUID = e1e89e96-8118-446c-900d-d123b1b566ea

    人[uuid = e1e89e96-8118-446c-900d-d123b1b566ea]


    出力では、クライアントコードのpostForObject(...)restテンプレートメソッドでオブジェクトuuidを渡すことがわかります。

    あなたの問題の解決策の一番下の行は、uuid入力パラメータに@RequestBodyを使用する必要があるということです

    あなたがアイデアと解決策を得たことを願って!

あなたの答え