2013-03-25 34 views
8

Sử dụng Tomcat 7 --- Thủ thuật 3.4.1 --- mặt javax 2.1.17 --- prettyfaces-jsf2 3.3.3sử dụng khuôn mặt đẹp với bộ lọc web

Tôi đã định cấu hình khuôn mặt khá đẹp trên dự án của mình nhưng bộ lọc web không hoạt động với các url mới được viết bởi khuôn mặt đẹp.

Dưới đây là một ví dụ khá-config.xml

<url-mapping id="home"> 
    <pattern value="/home"/> 
    <view-id value="/secure/homepage.xhtml"/> 
</url-mapping> 

<url-mapping id="register"> 
    <pattern value="/register"/> 
    <view-id value="/public/register.xhtml"/> 
</url-mapping> 

<url-mapping id="welcome"> 
    <pattern value="/"/> 
    <view-id value="/public/welcome.xhtml"/> 
</url-mapping> 

<url-mapping id="profile"> 
    <pattern value="/profile/#{userId}"/> 
    <view-id value="/profile.xhtml"/> 
</url-mapping> 

đăng nhập (chào đón) và đăng ký trang sau nằm trong thư mục "công cộng", và bộ lọc web của họ được định nghĩa với chú thích: @WebFilter ("/ công/* ")

cho trang chủ trong thư mục" an toàn "(chính xác sẽ có nhiều trang trong thư mục), tôi cũng đã xác định bộ lọc web và chú thích của nó: @WebFilter ("/secure/*)

các url đẹp đang hoạt động tốt, nhưng các bộ lọc này chỉ hoạt động khi tôi viết các url gốc.

1) Làm cách nào để sửa chữa bộ lọc web của tôi?

2) Tôi cũng muốn chặn người dùng nhập url gốc. Tôi biết rằng khuôn mặt xinh đẹp đang ẩn hoàn toàn các url gốc nhưng có cách nào để làm điều đó không?

- SOLVED - cảm ơn cho BalusC

nếu bạn định nghĩa các bộ lọc của bạn với các chú thích, bạn có thể cấu hình cài đặt điều phối như

@WebFilter (urlPatterns = "/ công cộng/*", dispatcherTypes = {DispatcherType.REQUEST, DispatcherType.FORWARD})

Trả lời

11

PrettyFaces sử dụng như nhiều giải pháp viết lại URL RequestDispatcher#forward() để chuyển tiếp yêu cầu đến tài nguyên đích mong muốn.

Bộ lọc Servlet, khi được ánh xạ mà không có bất kỳ <dispatcher>, chỉ theo mặc định theo yêu cầu "ban đầu", không theo yêu cầu được chuyển tiếp, bao gồm hoặc không được gửi lỗi.

Vì vậy, khi bạn ánh xạ một bộ lọc servlet trong web.xmlsau các PrettyFaces một, sau đó nó sẽ theo mặc định không được kích hoạt, trừ khi bạn rõ ràng thiết lập một <dispatcher> trên FORWARD bên cạnh mặc định của REQUEST (bạn nên giữ một này đối với trường hợp, PrettyFaces thực sự không cần thực hiện chuyển tiếp).

<filter-mapping> 
    ... 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
</filter-mapping> 

Hoặc, đối với trường hợp bạn đang sử dụng @WebFilter trên bộ lọc của bạn, sử dụng dispatcherTypes thuộc tính:

@WebFilter(..., dispatcherTypes = { REQUEST, FORWARD }) 

Ngoài ra, nếu bộ lọc trong câu hỏi không làm thay đổi mục tiêu request/response trong bất kỳ cách nào, ví dụ đặt bộ ký tự, nén bằng Gzip, nghe ngoại lệ, v.v., sau đó bạn cũng có thể đặt nó trước kiểu PrettyFaces.

+0

Tôi không chỉ định bất kỳ bộ lọc nào trong web.xml, BalusC. Bởi vì tôi đang sử dụng phiên bản = "3.0" và khá là tự cấu hình tự động như được viết trong tài liệu.Các bộ lọc web của tôi cũng được xác định rõ ràng bằng chú thích. Tôi có định nghĩa nó trực tiếp trên web.xml cho các thiết lập điều phối không? – oko

+0

Chỉ cần sử dụng '@WebFilter (dispatcherTypes)'. Xem câu trả lời được cập nhật. – BalusC

+0

cảm ơn bạn @ BalusC, nó hoạt động rất tốt. @WebFilter (urlPatterns = "/ public/*", dispatcherTypes = {DispatcherType.REQUEST, DispatcherType.FORWARD}) giải quyết được sự cố của tôi. Nhưng tôi muốn hỏi một câu hỏi nhỏ, cập nhật hoặc làm mới cùng một trang (ví dụ bằng cách sử dụng thăm dò ý kiến ​​thủ tướng) luôn luôn bị bắt bởi các bộ lọc và thực sự hoàn toàn bình thường của nó. Nhưng có cách nào để thoát khỏi nó? – oko

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