2012-03-17 20 views

Trả lời

0

Chúng tôi thường sử dụng Bộ lọc khi chúng tôi muốn lọc và/hoặc sửa đổi yêu cầu dựa trên các điều kiện cụ thể. Để S2 hoạt động, cần thực hiện xử lý lại và sửa đổi nhất định để thực hiện thành công yêu cầu của bạn trong khi chúng tôi sử dụng Servlet khi chúng tôi muốn kiểm soát, xử lý trước và/hoặc yêu cầu sau xử lý.

Để yêu cầu kiểm soát, sử dụng Servlet dưới mui xe nhưng bị ẩn đi để làm cho cấu trúc ứng dụng tổng thể sạch sẽ hơn và dễ sử dụng hơn.

Đây là những gì chúng tôi có cho Bộ lọc trong Java EE 6 Tutorial.

Bộ lọc là đối tượng có thể chuyển đổi tiêu đề và nội dung (hoặc cả hai) của yêu cầu hoặc phản hồi. Các bộ lọc khác với các thành phần web trong bộ lọc đó thường không tự tạo ra phản hồi. Thay vào đó, một bộ lọc cung cấp chức năng có thể được "đính kèm" vào bất kỳ loại tài nguyên web nào. Do đó, một bộ lọc không nên có bất kỳ sự phụ thuộc nào vào tài nguyên web mà nó hoạt động như một bộ lọc; theo cách này, nó có thể được tạo thành với nhiều loại tài nguyên web.

5

Theo sách Struts2 Budi Karnival struts2, Có một lợi thế khác biệt khi sử dụng bộ lọc trên servlet làm bộ điều khiển. Với một bộ lọc, bạn có thể thuận tiện chọn để phục vụ tất cả các tài nguyên trong ứng dụng của bạn, bao gồm cả các tài nguyên tĩnh.

Với một servlet, bộ điều khiển của bạn chỉ xử lý quyền truy cập vào phần động của ứng dụng. Lưu ý rằng các yếu tố url-pattern trong file web.xml trong ứng dụng trước đó là

<servlet> 
    <servlet-name>Controller</servlet-name> 
    <servlet-class>...</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>Controller</servlet-name> 
    <url-pattern>*.action</url-pattern> 
</servlet-mapping> 

Với một bối cảnh như vậy, các yêu cầu về tài nguyên tĩnh không được xử lý bởi bộ điều khiển servlet, nhưng bằng container. Bạn sẽ không muốn xử lý các tài nguyên tĩnh trong bộ điều khiển servlet của bạn vì điều đó có nghĩa là làm việc thêm.

Bộ lọc khác nhau. Một bộ lọc có thể chọn để cho phép thông qua các yêu cầu cho nội dung tĩnh. Để chuyển yêu cầu, hãy gọi phương thức filterChain.doFilter trong phương thức doFilter của bộ lọc.

Do đó, việc sử dụng bộ lọc làm bộ điều khiển cho phép bạn chặn tất cả các yêu cầu đến ứng dụng, bao gồm cả yêu cầu nội dung tĩnh. Sau đó, bạn sẽ có cài đặt sau trong bộ mô tả triển khai của mình:

<filter> 
    <filter-name>filterDispatcher</filter-name> 
    <filter-class>...</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>filterDispatcher</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

Ưu điểm của bộ lọc này: Một điều chắc chắn là bạn có thể dễ dàng bảo vệ các tệp tĩnh khỏi mắt tò mò.

Đoạn mã dưới đây sẽ gửi một thông báo lỗi nếu người dùng cố gắng để xem một tập tin JavaScript:

public void doFilter(ServletRequest request, ServletResponse response,FilterChain  filterChain) throws IOException, ServletException { 
    HttpServletRequest req = (HttpServletRequest) request; 
HttpServletResponse res = (HttpServletResponse) response; 
String uri = req.getRequestURI(); 
if (uri.indexOf("/css/") != -1 && req.getHeader("referer") == null) { 
    res.sendError(HttpServletResponse.SC_FORBIDDEN); 
} else { 
    // handle this request 
} 
} 

Nó sẽ không bảo vệ mã của bạn từ những người quyết tâm nhất, nhưng kiểu người dùng có thể không còn trong URL của tệp tĩnh của bạn để xem nó. Với cùng một mã thông báo, bạn có thể bảo vệ hình ảnh của mình để không ai có thể liên kết với chúng theo chi phí của bạn.

Một ưu điểm khác:

Sự ra đời của đánh chặn trong struts2 framework.It không chỉ làm giảm công sức viết mã của chúng tôi, nhưng giúp chúng ta viết bất kỳ mã mà chúng tôi đã sử dụng các bộ lọc để mã hóa và thay đổi cần thiết trong các trang web. xml như trái ngược với Struts1.So bây giờ bất kỳ mã nào phù hợp hơn trong Bộ lọc giờ đây có thể chuyển sang bộ chặn (có thể kiểm soát nhiều hơn bộ lọc), tất cả cấu hình có thể được kiểm soát trong tệp struts.xml, không cần chạm vào tệp web.xml

+0

@Punit_Patel Nếu 'servlet-mapping' của' ActionServlet' cho Struts 1 được đặt thành '/' thay vì '* .action', thì Struts 1 sẽ không nắm bắt tất cả nội dung tĩnh và hành động theo cùng cách với 'FilterDispatcher' của Strut 2? – 8bitjunkie

+0

@ 7SpecialGems Nếu bạn sử dụng/như ánh xạ url cho ActionServlet, bạn phải viết thêm mã. Ví dụ, trong trường hợp tệp CSS bạn phải viết mã để đọc tệp CSS và ghi vào đối tượng phản hồi. Trong trường hợp của Filter, bạn có thể gọi phương thức filterChain.doFilter trong phương thức doFilter của bộ lọc. –

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