2010-09-07 20 views
6

bạn có thể giúp kiểm tra lý do tại sao doFilter không nhận được gọi làdoFilter không nhận được gọi

web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> 
<context-param> 
<param-name>log4jConfigLocation</param-name> 
<param-value>/WEB-INF/log4j.properties</param-value> 
</context-param> 
<listener> 
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
</listener> 
<filter> 
<filter-name>roseFilter</filter-name> 
<filter-class>net.paoding.rose.RoseFilter</filter-class> 
</filter> 
<filter-mapping> 
<filter-name>roseFilter</filter-name> 
<url-pattern>/*</url-pattern> 
<dispatcher>REQUEST</dispatcher> 
<dispatcher>FORWARD</dispatcher> 
<dispatcher>INCLUDE</dispatcher> 
</filter-mapping> 
</web-app> 

lớp chữ ký:

import org.springframework.web.filter.GenericFilterBean; 
public class RoseFilter extends GenericFilterBean { 

404 được trả về khi gọi http://localhost:8080/hello/world, tôi thiết lập các điểm ngắt tại doFilter, có vẻ như doFilter không được gọi? (Tôi đã thử tomcat 6.0.18, 6.0.29, jdk1.6)

+1

Có '/ hello/world' giải quyết thành tài nguyên cho máy chủ của bạn không? Nếu không, không có lý do gì để bắt đầu một chuỗi bộ lọc. – rsp

+2

Tôi khá chắc chắn rằng tôi đã đi qua điều này bản thân mình trước đây, với mô hình '/ *' không hoạt động. Tôi không nghĩ rằng tôi đã bao giờ giải quyết nó. – skaffman

+0

@rsp: tài nguyên không nhất thiết phải là nguồn tài nguyên hiện có. Tuy nhiên, bộ lọc (và servlet) được ánh xạ trên '/ *' sẽ được gọi ra. Nó có thể là hành động như một bộ điều khiển phía trước. – BalusC

Trả lời

21

Bộ lọc sẽ không được áp dụng khi:

  1. lớp Bộ lọc là mất tích trong classpath và/hoặc không thể nạp hoặc instantiable. Tuy nhiên, bạn nên chú ý đến nó trong nhật ký khởi động của máy chủ. Giải pháp được tìm thấy dựa trên việc giải thích các ngoại lệ/lỗi được tìm thấy trong nhật ký máy chủ.

  2. Có một bộ lọc chạy trước trong chuỗi mà không gọi FilterChain#doFilter(), nhưng thay vì RequestDispatcher#forward() hoặc include() khiến các bộ lọc tiếp theo trong chuỗi là hoàn toàn bỏ qua (khi họ không lắng nghe trên FORWARD hoặc INCLUDE điều vận, họ bởi mặc định chỉ lắng nghe trên REQUEST điều phối). Giải pháp là sửa chữa bộ lọc sai hoặc để thêm <dispatcher>FORWARD</dispatcher> vv tương ứng hoặc sắp xếp lại các khai báo bộ lọc trong web.xml để bộ lọc mới của bạn xuất hiện trước bộ lọc khác (bạn chỉ cần đảm bảo rằng bộ lọc mới của bạn đang sử dụng FilterChain#doFilter() đúng cách :)).

  3. URL yêu cầu không đúng. Bạn đã sử dụng http://localhost:8080/hello/world. Với bộ lọc nghe theo số /*, điều này có nghĩa là ngữ cảnh webapp phải là ROOT hoặc ít nhất /hello. Xác minh ngữ cảnh webapp của bạn. Tôi chỉ thử lại với một URL trỏ đến một JSP/Servlet hợp lệ bên trong cùng một ứng dụng web mà tạo ra một phản hồi không 404. Liệu các bộ lọc sau đó có được gọi là tốt?

+0

1. Lớp lọc là tốt vì initFilterBean được gọi đúng. –

+0

2. Tôi đã cập nhật web.xml, vui lòng kiểm tra. –

+0

Tôi kiểm tra hàm destroy() API: Phương thức này chỉ được gọi khi tất cả các luồng trong phương thức doFilter của bộ lọc đã thoát hoặc sau một khoảng thời gian chờ đã trôi qua. Có lẽ nó là thời gian chờ? –

0

Yêu cầu web trông như thế nào? Bạn có thể thử thay đổi mẫu url của mình thành * .jsp thay vì/* không? Nếu bạn đang sử dụng một cái gì đó khác hơn là JSP tinh khiết sau đó thay đổi nó để bất cứ phần mở rộng yêu cầu kết thúc là (như cho struts nó thường là * .do).

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