2009-08-07 5 views
5

저지를 사용하는 웹 응용 프로그램에서 작업하고 있습니다. URIBuilder 및 seeOther 응답을 사용하여 get-after-post 일종의 구현하려고합니다. 목표는 브라우저가 이미 가지고있는 동일한 URI로 리다이렉트 (redirect)하지만 GET을 강제하는 것이다. 그것은 작동이 같은 비트 :저지 - 리디렉션을 사용하면 리디렉션 루프가 발생 함

  1. 요청이 PUT 요청이 SeeOther 응답이

무엇 발생해야하는 것은 브라우저가 303 페이지의 기타를 집어 들고 있음을 반환

  • 처리
  • PUT을 통해 들어 오면 수신하는 URI에 대해 GET을 수행합니다. 유감스럽게도, URI에서 PUT을 수행하고 (내가 알 수있는 한) PUT은 위의 1 단계로 돌아가서 방향 전환 루프를 발생시킵니다.

    어떤 아이디어가 잘못 되었습니까?

    private Response giveSeeOther(){ 
        /*Get the base URI builder*/ 
        final UriBuilder uriBuilder = m_uriInfo.getBaseUriBuilder(); 
    
        /* Some stuff to create the URI */ 
        final Map<String, Object> parameterMap = new HashMap<String, Object>(); 
        parameterMap.put("uid", getUid()); 
    
        final URI redirectUri = uriBuilder.path(SomeObject.class). 
                path(SomeObject.class, "get"). 
                buildFromMap(parameterMap); 
    
        /* See Other (303) */ 
        return Response.seeOther(redirectUri).build();} 
    

    이것은 다른 방법을 보는 코드입니다. 다른 코드를보고 싶을 지 모르겠지만 알려주세요.

  • +0

    'seeOther'에 대한 코드가 멋지게 보입니다. (내가 uriBuilder가 클래스에서하는 일을 이해하지 못함). PUT 핸들러에서만'giveSeeOther()'를 호출하고 일반 핸들러에서는 호출하지 말아야한다. 또한 어떤 사용자 에이전트에서이 동작을 볼 수 있는지 알고 싶습니다. – Guss

    답변

    8

    대신 301 HTTP 응답 코드를 사용해야합니다.

    303을 사용하면 POST 요청이 유지되고 그에 따라 리디렉션됩니다. 301을 사용하면 GET을 통해 귀하의 요청이 "영구적으로 이동"됩니다.

    누군가가 왜 이것을하고 싶어하는지 궁금해하는 독자에게는 웹 브라우저의 "다시로드"기능 ("썩은 통신"문제가있는 사용자)을 사용하여 POST 데이터를 두 번 이상 제출하지 못하도록하는 것입니다. 자주로드하지 마시고 "고맙습니다"페이지를 다시로드하십시오.

    힌트 : 이러한 방식으로 리디렉션 할 때 쿠키를 사용하여 '감사'페이지로 정보가 전달되지 않으면 동일한 방식으로 요청에 하나 이상의 매개 변수를 추가해야합니다 정규 GET 양식이됩니다. 주문 ID 번호가 82838 인 경우 예를 들어, 당신에게 함께 전달할 수있는이 같은 페이지에 "감사합니다"

    http://www.example.com/order/thank-you.pl?orderid=82838

    쉽게함으로써 해결이와 명백한 잠재적 인 보안 문제가 있습니다 당신의 "감사합니다"페이지 코드는 주문 상태를 표시하기 전에 주문 ID가 현재 로그인 한 사용자에게 실제로 속하는지 확인합니다 ("감사합니다"페이지에 주문 상태 정보를 포함한다고 가정합니다.이 경우에는 짧은 단계에서 여러 단계로 진행되는 경우 사용자가 주문 상태를 확인하기 위해 '새로 고침'버튼 {또는 링크}을 포함시키는 것이 좋습니다.

    여러분에게 도움이되기를 바랍니다.