2009-07-22 47 views
5

Khi người dùng đăng nhập thành công vào hệ thống, hệ thống sẽ chuyển hướng người dùng đến trang chủ. Bây giờ vấn đề của tôi là, nếu người dùng nhấp vào trang tài khoản chế độ xem mà không cần đăng nhập vào hệ thống, hệ thống sẽ chuyển hướng người dùng đến trang đăng nhập. nếu người dùng đăng nhập vào hệ thống ngay bây giờ thì hệ thống sẽ chuyển hướng người dùng đến trang chủ, trong trường hợp này, bất kỳ phương thức nào có thể chuyển hướng người dùng đến trang trước đó là xem trang tài khoản thay vì trang chủ?Chuyển hướng điều hướng JSF đến trang trước

tôi đã cố gắng sử dụng phiên

String url = (String)session.getAttribute("url"); 
if(url != null) 
    response.sendRedirect(url); 
else 
    response.sendRedirect("homepage.faces"); 

tôi đặt mã này dưới public void doBtnAction() {} nếu người dùng đăng nhập thành công sau đó chuyển hướng đến url. Nhưng tôi gặp lỗi này

java.lang.IllegalStateException: Cannot forward after response has been committed 
    com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:322) 
    com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:130) 
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:87) 
    com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200) 
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:117) 
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:198) 

Trả lời

0

Bạn chưa mô tả bất kỳ cơ sở khuôn khổ nào bạn sử dụng để xác thực vì vậy tôi cho rằng bạn thực hiện xác thực bằng mã riêng. Có lẽ, cách tiếp cận đơn giản nhất là lưu đích ban đầu trong phiên trước khi chuyển hướng đến trang đăng nhập, sau đó sau khi đăng nhập thành công, bạn có thể kiểm tra thuộc tính này và chuyển hướng đến đúng vị trí. Tôi đặc biệt cho JSF bạn có thể làm điều này trong phương thức hành động xử lý đăng nhập. Trên thực tế, tôi khuyên bạn nên sử dụng một số khung để xác thực, ví dụ: Spring Security, vì nó thực hiện những điều như vậy, và sẽ dễ dàng hơn để mở rộng hệ thống bảo mật của bạn trong trường hợp bạn cần thêm một số tính năng. thêm một số cấu hình

+0

Seam cũng cho phép bạn thực hiện điều này ra khỏi hộp – mtpettyp

+0

Tôi đang sử dụng JSF và bộ lọc để kiểm tra xem phiên là null nếu null chuyển hướng người dùng đến trang đăng nhập. –

2

Không chắc, nhưng cố gắng làm điều này thông qua ExternalContext cơ sở vật chất:

Something như thế này:

ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); 
externalContext.redirect(externalContext.encodeResourceURL(externalContext.getRequestContextPath()+getUrl())); 
-2

bạn đang quá muộn và đó là đem lại cho bạn những ngoại lệ. Làm nó trong phaselistener trước pha phản hồi kết xuất.

+3

Điều này không có ý nghĩa. – BalusC

15

Ngoại lệ này là do bạn gọi là response.sendRedirect() và không chặn JSF hiển thị phản hồi bình thường. Bạn cần thông báo cho JSF rằng họ không cần xử lý phản hồi bình thường bằng cách thêm

FacesContext.getCurrentInstance().responseComplete(); 

vào phương thức hành động.

Hoặc, thậm chí tốt hơn, chỉ cần không nhận được HttpServletResponse từ dưới mũ trùm của JSF, nhưng thay vì làm:

FacesContext.getCurrentInstance().getExternalContext().redirect(url); 

này sẽ tự động gọi responseComplete() và nó cũng giữ mã của bạn sạch từ Servlet không cần thiết thứ API . Xem thêm ExternalContext API.

+0

Tôi yêu stackoverflow! Tôi vẫn chưa cần đặt câu hỏi, bởi vì tôi luôn tìm thấy câu trả lời của tôi đã được trả lời ở đây. Cảm ơn BalusC. – Naganalf

+0

Điều này không làm việc trong trường hợp của tôi: khi tôi gọi getAttribute ("url") trên HttpSession, tôi nhận được null. Tôi đã thử gọi getRequestURI() trên HttpServletRequest, nhưng điều này trả về URI của trang đăng nhập mà người dùng được chuyển hướng nếu anh ta không đăng nhập. – Theo

+0

@Theo: đó là một vấn đề hoàn toàn khác. Bạn đã tự mình đặt nó trước :) – BalusC

0

java.lang.IllegalStateException: Không thể đợi sau khi phản ứng đã được cam kết

Trường hợp ngoại lệ là khá rõ ràng:

  • Câu trả lời đã được cam kết.
  • Bạn không thể chuyển tiếp sau khi phản hồi đã được cam kết.

Điều gì không có ý nghĩa?

0

Mô tả logic (chuyển hướng đăng nhập) phải được triển khai thông qua Cơ chế bộ lọc. Ngoài ra, bạn có thể thử các quy tắc chuyển hướng tiêu chuẩn jsf (nếu nó có thể phù hợp với bạn). Và nếu bạn vẫn muốn gửi chuyển hướng đến một url tùy chỉnh và không muốn sử dụng Bộ lọc, hãy làm điều đó trong servlet của bạn trong pha hiển thị, không phải trong bean jsf của bạn.

-2

Đặt cú pháp dưới đây trong web.xml nên làm việc:

<context-param> 
<param-name>com.sun.faces.writeStateAtFormEnd</param-name> 
<param-value>false</param-value> 
</context-param> 
+0

Đây là giải pháp cho một ** nguyên nhân ** khác nhau xảy ra dẫn đến một ngoại lệ simliar (nhưng không giống nhau!). Xem thêm http://stackoverflow.com/questions/8072311/illegalstateexception-cannot-create-a-session-after-the-response-has-been-commi/8072445#8072445 – BalusC

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