2009-08-07 29 views
5

Tôi đang làm việc trên một ứng dụng web sử dụng Jersey. Tôi đang cố gắng để thực hiện một loại sau khi nhận được điều bằng cách sử dụng một URIBuilder và một phản ứng seeOther. Mục đích là để chuyển hướng đến cùng một URI trình duyệt đã được bật, nhưng để buộc GET. Nó hoạt động một chút như thế này:Jersey - Chuyển hướng bằng cách sử dụng không được đặt, nguyên nhân chuyển hướng vòng lặp

  1. Yêu cầu do thỏa thuận qua PUT
  2. yêu cầu PUT xử lý
  3. phản ứng SeeOther trở

gì nên xảy ra là trình duyệt nhặt 303 Xem khác và thực hiện một GET trên URI nó nhận được. Thật không may, những gì đang xảy ra là nó thực hiện một PUT trên URI thay vì (theo như tôi có thể nói) và PUT gửi nó trở lại Bước 1. ở trên, gây ra một vòng lặp chuyển hướng.

Mọi ý tưởng có vấn đề gì ở đây?

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();} 

Đó là mã để xem phương pháp khác. Tôi không chắc bạn muốn xem mã nào khác, nhưng hãy cho tôi biết.

+0

Mã của bạn cho 'seeOther' trông ổn (không phải là tôi hiểu uriBuilder làm gì với các lớp). Một điều cần kiểm tra là bạn gọi 'giveSeeOther()' chỉ từ một trình xử lý PUT và không phải từ một trình xử lý chung. Tôi cũng muốn biết những tác nhân người dùng nào bạn thấy hành vi này. – Guss

Trả lời

8

Thay vào đó, bạn cần sử dụng mã phản hồi HTTP HTTP.

Bằng cách sử dụng 303, yêu cầu POST của bạn được duy trì và được chuyển hướng tương ứng. Bằng cách sử dụng 301, yêu cầu của bạn là "Đã chuyển vĩnh viễn" qua GET. Đối với những độc giả khác có thể thắc mắc tại sao ai đó muốn làm điều này, nó ngăn người dùng gửi dữ liệu POST của họ nhiều hơn một lần bằng cách sử dụng chức năng "Nạp lại" của trình duyệt web của họ (người dùng có vấn đề "liên lạc bị hỏng") thường làm) để tải lại trang "cảm ơn" có thể chưa tải hoàn toàn.

Gợi ý: Khi bạn chuyển hướng theo cách này, nếu bạn không sử dụng cookie để đảm bảo thông tin được truy cập vào trang "cảm ơn", bạn sẽ cần phải thêm một hoặc nhiều thông số vào yêu cầu của mình theo cùng một cách một biểu mẫu GET thông thường sẽ. Ví dụ, nếu số thứ tự ID là 82.838, bạn có thể vượt qua nó cùng với bạn "cảm ơn" như thế này:

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

Có rõ ràng vấn đề an ninh tiềm năng với điều này mà có thể dễ dàng được giải quyết bằng cách của bạn Mã "thank you" kiểm tra xem ID đơn đặt hàng có thực sự thuộc về người dùng hiện đã đăng nhập hay không trước khi nó hiển thị trạng thái đơn đặt hàng (tôi giả sử bạn muốn bao gồm thông tin trạng thái đơn hàng trên trang "cảm ơn" - trong trường hợp này, nó cũng tốt đẹp để bao gồm nút "Làm mới" {hoặc liên kết} để người dùng kiểm tra trạng thái đơn hàng nếu đó là điều gì đó tiến triển trong ngắn hạn qua một số bước).

Tôi hy vọng điều đó sẽ hữu ích cho bạn.

Các vấn đề liên quan