2012-06-05 30 views
6

Phát triển ứng dụng web trong Java EE với JSF. Tất cả các trang đều được bảo vệ bằng cách xem bằng biểu mẫu xác thực với hành động 'j_security_check' và đầu vào 'j_username' và 'j_password'.Chuyển hướng sai sau khi đăng nhập (Java EE w/JSF)

Sau khi đăng nhập thành công trong việc, tuy nhiên, tôi đang chuyển hướng không để trang tôi muốn truy cập nhưng đến URL này

/faces/javax.faces.resource/jsf.js?ln=javax.faces&stage=Development 

Vì vậy, tôi nhìn vào jsf.js tập tin kịch bản với tất cả các mã JS thay vì trang tôi muốn xem. Việc truy cập vào trang web gốc hoặc bất kỳ trang nào khác không quan trọng, mỗi lần tôi được chuyển hướng đến URL này. Sau đó, tôi thay đổi URL sang bất kỳ trang nào, nó tải nó tốt và tôi đã đăng nhập.

Tôi phải nói rằng tôi đã gặp phải vấn đề này một cách kỳ diệu đã biến mất để nó chuyển hướng chính xác. Sau vài tuần nó lại bị phá vỡ nhưng tôi không biết nếu đó là lỗi của tôi, và nếu tôi không biết nguyên nhân. Tôi đã không được rối tung với chuyển hướng hoặc quy tắc điều hướng ở tất cả.

Điều đáng nói là tôi cũng đang sử dụng PrettyFaces.

EDIT:

<security-constraint> 
    <display-name>secured</display-name> 
    <web-resource-collection> 
     <web-resource-name>all</web-resource-name> 
     <description/> 
     <url-pattern>/*</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <description/> 
     <role-name>admin</role-name> 
     <role-name>teacher</role-name> 
    </auth-constraint> 
</security-constraint> 
<security-constraint> 
    <display-name>secured for admins</display-name> 
    <web-resource-collection> 
     <web-resource-name>admin pages</web-resource-name> 
     <description/> 
     <url-pattern>/admin/*</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <description/> 
     <role-name>admin</role-name> 
    </auth-constraint> 
</security-constraint> 
<security-constraint> 
    <display-name>unsecured</display-name> 
    <web-resource-collection> 
     <web-resource-name>css</web-resource-name> 
     <description/> 
     <url-pattern>/css/*</url-pattern> 
    </web-resource-collection> 
    <web-resource-collection> 
     <web-resource-name>js</web-resource-name> 
     <description/> 
     <url-pattern>/js/*</url-pattern> 
    </web-resource-collection> 
    <web-resource-collection> 
     <web-resource-name>img</web-resource-name> 
     <description/> 
     <url-pattern>/img/*</url-pattern> 
    </web-resource-collection> 
</security-constraint> 
<login-config> 
    <auth-method>FORM</auth-method> 
    <realm-name>wetk-security</realm-name> 
    <form-login-config> 
     <form-login-page>/faces/login.xhtml</form-login-page> 
     <form-error-page>/faces/login.xhtml</form-error-page> 
    </form-login-config> 
</login-config> 
+0

Có gì trong các phần tử '' của tệp 'web.xml'? –

+0

Đã chỉnh sửa câu hỏi. – redhead

Trả lời

8

container quản lý an ninh sẽ chuyển hướng đến các yêu cầu HTTP cuối cùng đã kích hoạt việc kiểm tra xác thực. Trong trường hợp của bạn, nó có vẻ là tệp JavaScript API JSJ ajax được bao gồm tự động. Điều đó có thể xảy ra nếu trình duyệt đã tải trang được xác thực hoàn toàn từ bộ nhớ cache của trình duyệt, trong khi trình duyệt đã tải tệp JS hoàn toàn từ phía máy chủ hoặc đã kiểm tra tính hợp lệ của bộ nhớ cache của tệp JavaScript bằng yêu cầu GET có điều kiện .

Bạn muốn loại trừ các nguồn lực JSF (<h:outputScript>, <h:outputStylesheet><h:graphicImage> từ kiểm tra xác thực. Bạn có thể làm điều đó bằng cách loại trừ các mẫu URL chung /javax.faces.resource/*. Bạn chỉ có thể muốn thêm mô hình /faces tiền tố như bạn rõ ràng sử dụng nó thay vì mô hình *.xhtml hậu tố.

Bạn cũng cần phải hướng dẫn trình duyệt không bộ nhớ cache hạn chế trang để ngăn chặn việc tải trình duyệt nó từ bộ nhớ cache (ví dụ như bằng cách nhấn lại nút sau khi logout). Bản đồ các bộ lọc sau trên cùng một mẫu URL như một trong số <security-constraint> của bạn.

@WebFilter("/secured/*") // Use the same URL pattern as <security-constraint> 
public class NoCacheFilter implements Filter { 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest httpReq = (HttpServletRequest) request; 
     HttpServletResponse httpRes = (HttpServletResponse) response; 

     if (!httpReq.getRequestURI().startsWith(httpReq.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc) 
      httpRes.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. 
      httpRes.setHeader("Pragma", "no-cache"); // HTTP 1.0. 
      httpRes.setDateHeader("Expires", 0); // Proxies. 
     } 

     chain.doFilter(request, response); 
    } 

    // ... 
} 
+0

Vì vậy, tôi đã thử mã của bạn và trong quá trình đăng nhập (yêu cầu đầu tiên và sau khi gửi biểu mẫu) bộ lọc không bao giờ nhận được trang được yêu cầu. Nó chỉ nhận được nó khi tôi thay đổi URL một lần nữa. Vì vậy, không làm việc một lần nữa, tôi vẫn thấy kịch bản JS. – redhead

+0

Bạn có xóa bộ nhớ cache của trình duyệt trước khi thử nghiệm không? – BalusC

+0

Tôi đã thử Opera hoàn toàn bị xóa nhưng không thay đổi. – redhead

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