2010-07-15 34 views
21

Sự khác biệt, thực sự là gì, giữa các bộ lọc và bộ chặn? Tôi nhận ra rằng các bộ chặn đánh chặn trước và sau một hành động, đệ quy, và các bộ lọc có thể được cấu hình để kích hoạt các hành động và trên các mẫu url nhất định. Nhưng làm thế nào để bạn biết khi nào nên sử dụng mỗi cái?Bộ lọc và Bộ chặn trong Struts 2

Trong cuốn sách tôi đang đọc trên Struts 2, có vẻ như máy đánh chặn đang bị đẩy và tôi thậm chí còn làm theo hướng dẫn để viết Trình chặn nhận thực để đảm bảo người dùng đăng nhập. Tuy nhiên, nếu người dùng cố gắng truy cập một URL không có hành động liên kết với nó, trình chặn chặn không bắt được nó, điều đó có nghĩa là tôi phải liên kết một hành động với mọi jsp mà tôi muốn được bảo mật. Điều đó có vẻ không đúng.

Tôi có thể tạo Bộ lọc xác thực xử lý các URL để tôi không phải làm điều đó, nhưng sau đó, điểm của kẻ đánh chặn là gì?

+10

Thực hành tốt là gắn bó tệp .jsp trong thư mục/WEB-INF. Bằng cách đó, họ không thể được yêu cầu trực tiếp bởi URL. Thay vào đó, người dùng phải thực hiện các hành động, sau đó chuyển tiếp đến đúng jsp (tùy thuộc vào kết quả). – Pat

Trả lời

4

vụ cháy ngăn xếp ngăn chặn trên mọi yêu cầu.
bộ lọc chỉ áp dụng cho các url mà chúng được xác định.

chỉnh sửa - bạn sử dụng cái này hoặc cái kia tùy theo nhu cầu. Giả sử bạn cần phải xác minh một cookie có mặt cho mọi yêu cầu. Người dùng một kẻ đánh chặn. Cho phép nói rằng bạn cần phải bật lên một ứng dụng bên ngoài trên một số yêu cầu (được thúc đẩy bởi một url), sử dụng một bộ lọc.

Tôi nghĩ rằng kẻ chặn là công cụ được sử dụng phổ biến hơn ...

tại sao bạn có url không có hành động liên quan?

+0

Đám cháy ngăn xếp ngăn chặn chỉ cho các yêu cầu được xác định trong gói mà ngăn xếp đó là ngăn xếp mặc định, tôi có thể có hành động được xác định trong các gói khác mà trình chặn sẽ không kích hoạt như bộ lọc. . Một bộ lọc cũng có thể áp dụng cho tất cả các url. Để xác minh xem cookie có hiện diện hay không, tôi không thấy lý do tại sao bạn cũng không chỉ sử dụng bộ lọc cho điều đó. Nếu bạn có một jsp đơn giản, chẳng hạn như biểu mẫu tải lên hình ảnh chẳng hạn, có thể không có bất kỳ công việc nào mà tôi cần một hành động. Tôi có nên tạo các lớp hành động cho mọi jsp không? Ngay cả khi chúng trống không? – JPC

+0

không có bạn là đúng, nếu không có điểm cho một hành động, sau đó không đặt một trong. Mặc dù từ những gì tôi nhớ một hành động có thể định tuyến đến một jsp chỉ được trả về một giá trị chuỗi. Tôi nghĩ bạn sẽ thấy rằng có rất nhiều cách để làm việc, vì vậy thực tế là có một số chồng chéo là tự nhiên. – hvgotcodes

+0

Tôi đoán tôi chỉ đang tìm cách thực hành tốt nhất và không thể tìm thấy bất kỳ câu trả lời nào. Đặc biệt với plugin quy ước ngay bây giờ, nếu tôi có biểu mẫu tải lên, tôi có thể truy cập nó như một hành động bằng cách nhập "/ tải lên biểu mẫu" Tôi thậm chí không phải truy cập trực tiếp vào jsp. Vấn đề là, điều này không kích hoạt một máy đánh chặn vì vậy một bộ lọc là điều duy nhất mà sẽ bắt được điều này. – JPC

42

Sự khác biệt đáng kể nhất là "bộ chặn" là một phần của khung công tác Struts 2 và chỉ là một phần của xử lý yêu cầu được thực hiện bởi khung công tác Struts 2. Mặt khác, "Bộ lọc" là một phần của Thông số Servlet; nói cách khác, chúng là một phần của API Servlet. Nếu bạn đang sử dụng Struts 2, bạn nên sử dụng các interceptor để gói các chức năng xung quanh các hành động Struts 2 của bạn. Nếu bạn đang cố gắng bọc chức năng xung quanh các yêu cầu đến với webapp của bạn, nhưng không được xử lý bởi Struts 2, thì bộ lọc có thể phù hợp hơn.

BTW, toàn bộ khung Struts 2 được triển khai bên trong một bộ lọc được cấu hình trong ứng dụng web của bạn, khai báo trong deployment descriptor của webapp của bạn (web.xml) như:

<filter> 
     <filter-name>struts2</filter-name> 
     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>struts2</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

Bộ lọc này, mà được cấu hình để bắt tất cả các mẫu URL yêu cầu, là điểm vào trong toàn bộ khung công tác Struts 2.

Tôi hy vọng điều đó sẽ hữu ích.

+0

cảm ơn cho gợi ý về Servlet Spec và phân biệt khung công tác Struts 2. – asgs

+0

có nghĩa là chúng có cùng chức năng. – hiway

+2

@hiway Tôi sẽ không nói rằng họ có cùng chức năng, tôi sẽ nói rằng họ phục vụ cùng vai trò chức năng trong hai ngữ cảnh rất khác nhau. – chad

4

Interceptor là gì?

Khung công tác Struts 2 sử dụng khái niệm Interceptor để chia sẻ giải pháp cho một số mối quan tâm chung của các hành động khác nhau.

Như chúng ta biết khuôn khổ gọi một đối tượng Hành động cụ thể trên các phụ đề của một yêu cầu cho nó. Nhưng trước khi thực thi Action, lời gọi bị chặn bởi một số đối tượng khác để cung cấp thêm yêu cầu xử lý.

Tương tự sau khi thực thi Hành động, lệnh gọi lại có thể bị chặn lại. Đối tượng chặn này được gọi là Interceptor.

Vì vậy, mục đích của việc sử dụng Interceptor là cho phép kiểm soát tốt hơn lớp điều khiển và tách một số logic chung áp dụng cho nhiều hành động.

Khung công tác Struts 2 đã cung cấp bộ Interceptor riêng có thể được sử dụng trong ứng dụng để cung cấp xử lý bắt buộc trước và sau khi thực thi lớp Hành động.

Một trong số đó là "Công cụ chặn bí danh" mà tôi sẽ thảo luận ở đây.

Bí danh Interceptor:

Bí danh Interceptor được sử dụng trong trường hợp Chuỗi hành động. Chuỗi hành động có nghĩa là một Hành động gọi hành động khác sau khi thực hiện thành công hành động đầu tiên.

Công cụ chặn này bí danh một tham số được đặt tên cho tên thông số khác. Trong chuỗi hành động, khi hai lớp hành động khác nhau chia sẻ một tham số chung với một tên khác, Interceptor này được sử dụng để đặt tên bí danh cho một parmeter của lớp hành động đầu tiên, khớp với tên tham số trong lớp hành động thứ hai.

Bí danh của biểu hiện của hành động phải ở trong các hình thức:

   #{ 'name1' : 'alias1' , 'name2' : 'alias2' } 
3

Theo struts 2 vòng đời/kiến ​​trúc không chặn được thực hiện trước khi lọc. Vì vậy, nếu không có ánh xạ hành động cho yêu cầu của bạn thì nó không thành công trong khi đi qua bộ lọc.

0

Khung công tác Struts 2 không phụ thuộc vào API Servlet. Hành động Struts 2 không được kết hợp với vùng chứa. Thông thường các ngữ cảnh servlet được biểu diễn dưới dạng Bản đồ đơn giản, cho phép các hành động được kiểm tra riêng biệt.

Bộ lọc là một phần của API Servlet nên Khung công tác Struts 2 sử dụng khái niệm về Trình chặn để chia sẻ giải pháp cho một số mối quan tâm chung của các hành động khác nhau.

Ngoài ra, bạn có thể dễ dàng viết các trường hợp kiểm tra cho lớp Interceptor và Action.

0

Như một quy luật của

  • Các bộ lọc được chạy trước mỗi request. Bản thân số struts là một bộ lọc.
  • interceptors có thể chạy trước, sau khi thực hiện các hành động. Chúng sẽ không chạy nếu yêu cầu không kết thúc bằng .action.

Vì vậy, một số ví dụ về các bộ lọc có thể là:

  • Nếu bạn muốn nén jscss các tập tin, bạn nên đi cho các bộ lọc không chặn.
  • Nếu bạn muốn chỉ một số địa chỉ IP truy cập trang web của bạn, bạn phải phát triển nó như là bộ lọc và kiểm tra địa chỉ ip yêu cầu.
  • Nếu bạn muốn an toàn trang web của mình chống lại tấn công CSRF, bạn phải viết bộ lọc để kiểm tra mã thông báo CSRF theo yêu cầu.
  • Nếu bạn muốn đăng nhập phản ứng trang web của bạn mỗi lần yêu cầu, bạn có thể sử dụng một bộ lọc để tính toán thời gian trước và sau khi chain.doFilter(request, response)

Về mặt lý thuyết, bạn có thể phát triển một ứng dụng struts web mà không phát triển của riêng bạn interceptors và sử dụng filters chỉ có. Nhưng bạn sẽ phải đối mặt với rất nhiều vấn đề và bộ lọc lò hơi mã.

Rất nhiều tính năng struts 2 được xây dựng với bộ chặn, bạn có thể tìm thấy nó trong struts-default.xml (https://struts.apache.org/docs/struts-defaultxml.html) danh sách sẽ giúp tìm khi nào các trình chặn có thể được sử dụng. (Ví dụ ParametersInterceptor chạy trước khi hành động để áp dụng các giá trị hình thức đệ trình để hành động)

Trong khi làm việc với các máy bay đánh chặn, bạn có thể dễ dàng truy cập vào thanh chống các tính năng, ví dụ getText từ nguồn tin, có tên hành động hiện tại và không gian tên, thay đổi hành động lưu lượng.

Xét trên đây là một số trường hợp có thể được phát triển bởi chặn:

  • Nếu bạn muốn điều đó chỉ đăng nhập người dùng có thể truy cập vào những hành động nhất định, bạn phải phát triển nó với tên lửa đánh chặn.
  • Nếu bạn muốn theo dõi người dùng hành động nào đang điều hướng. Bạn có thể sử dụng một máy đánh chặn để theo dõi các hành động đã truy cập.
  • Nếu bạn muốn xử lý các lỗi hành động của bạn trong một điểm duy nhất, bạn có thể sử dụng một đánh chặn mà bắt tất cả invocation.invoke()

Các tên lửa đánh chặn đang cung cấp các bộ lọc và Chain of design pattern Trách nhiệm cho những hành động thanh chống, trong khi bộ lọc cung cấp mẫu này cho toàn bộ ứng dụng web của bạn.

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