2010-07-26 41 views

Trả lời

28

Ném một RestartResponseAtInterceptPageException sẽ làm điều đó, như bạn đã nêu trong câu trả lời của riêng bạn, nhưng đó thực sự là một phần của một hệ thống cho phép chuyển hướng với một sự tiếp nối cuối cùng ở trang hiện tại (thường xuyên một phần của quy trình ủy quyền). Nếu đó không phải là tình huống của bạn, nhưng bạn vẫn phải làm điều gì đó làm gián đoạn việc xử lý, có thể tốt hơn là nên ném một số RestartResponseException.

Cách sử dụng chính mà tôi biết trong số RestartResponseAtInterceptPageException nằm trong quá trình "chuyển hướng đến trang đăng nhập". Nếu bạn đang sử dụng xác thực dựa trên vai trò, việc triển khai IAuthorizationStrategy khi xác định rằng bạn không đăng nhập sẽ báo hiệu IUnauthorizedComponentInstantiationListener được định cấu hình, thường là AuthenticatedWebApplication mà ném ngoại lệ này nếu bạn chưa đăng nhập, với chuyển hướng đến cấu hình trang đăng nhập. (Nếu bạn đã đăng nhập nhưng không được phép, điều gì đó khác sẽ xảy ra ...).

Chuyển hướng thực tế được thực hiện bởi PageMap, cũng trong trường hợp này, hãy nhớ trang bạn đang cố truy cập. Sau khi đăng nhập thành công, trang đăng nhập có thể yêu cầu gửi cho bạn trang bạn đang cố gắng ban đầu bằng cách gọi continueToOriginalDestination(), là phương thức trong Component và truy xuất trang đã nhớ từ PageMap.

Có một số tốt example code cho quá trình xác thực này, nhưng ngoại lệ và chặn được ẩn đằng sau hậu trường một chút.

+0

Xin lỗi, tôi không hiểu ý của bạn là "tiếp tục cuối cùng tại trang hiện tại". Bạn có thể vui lòng xây dựng một chút? Cảm ơn trước. – Mot

+0

@mklhmnn: Tôi đã thêm một số ghi chú về cách sử dụng phổ biến và một chút về cách hoạt động của nó.Đó là phức tạp, vì vậy tôi không chắc chắn bao nhiêu điều này sẽ giúp. –

+0

Cảm ơn bạn đã giải thích chi tiết. – Mot

5

Tìm kiếm nhanh tất cả *Exception.java tệp trong wicket đã tiết lộ. Người ta phải ném một RestartResponseAtInterceptPageException:

public MyPage() { 
    ... 
    if (redirect) { 
     throw new RestartResponseAtInterceptPageException(targetPage); 
    } 
    ... 
} 
23

Redirect đến một trang wicket, sử dụng client-chuyển hướng (HTTP 302, của trình duyệt thay đổi URL):

import org.apache.wicket.RestartResponseException; 
import org.apache.wicket.request.mapper.parameter.PageParameters; 
... 
throw new RestartResponseException(
    TargetWicketPage.class, 
    new PageParameters().set("param1", "value1")); 

Redirect đến một trang wicket, sử dụng chuyển hướng máy chủ/về phía trước (URL của trình duyệt vẫn không thay đổi):

Kể từ Wicket 1.5RC5.1:

import org.apache.wicket.RestartResponseException; 
import org.apache.wicket.request.handler.PageProvider; 
import org.apache.wicket.request.handler.RenderPageRequestHandler.RedirectPolicy; 
import org.apache.wicket.request.mapper.parameter.PageParameters; 
... 
throw new RestartResponseException(
    new PageProvider(
     TargetWicketPage.class, 
     new PageParameters().set("param1", "value1")), 
    RedirectPolicy.NEVER_REDIRECT)); 

Trước Wicket 1.5RC5.1:

import org.apache.wicket.request.RequestHandlerStack.ReplaceHandlerException; 
import org.apache.wicket.request.handler.PageProvider; 
import org.apache.wicket.request.handler.RenderPageRequestHandler; 
import org.apache.wicket.request.handler.RenderPageRequestHandler.RedirectPolicy; 
import org.apache.wicket.request.mapper.parameter.PageParameters; 
... 
throw new ReplaceHandlerException(
    new RenderPageRequestHandler(
     new PageProvider(
      TargetWicketPage.class, 
      new PageParameters().set("param1", "value1")), 
     RedirectPolicy.NEVER_REDIRECT), 
    true); 

Redirect đến một URL, sử dụng HTTP 302 ("Đã tạm thời dời"):

import org.apache.wicket.request.flow.RedirectToUrlException; 
... 
throw new RedirectToUrlException("http://targetURL"); 

Redirect đến một URL, sử dụng HTTP 301 ("Moved Permanently", SEO thân thiện):

import org.apache.wicket.request.flow.RedirectToUrlException; 
import javax.servlet.http.HttpServletResponse; 
... 
throw new RedirectToUrlException("http://targetURL", 
    HttpServletResponse.SC_MOVED_PERMANENTLY); 
0

tôi chỉ tìm thấy

getRequestCycle().setResponsePage(MyOtherPage.class); 

mà là làm việc ít nhất là trong wicket 6. Nó hoạt động server-side và viết lại URL quá. Có thể nó nhanh hơn một chút so với sử dụng một ngoại lệ.

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