2013-08-20 25 views
8

Tôi đang viết bộ lọc Phản hồi Jersey. Tôi đang sử dụng Jersey 1.17. Tôi muốn truy cập vào một số thuộc tính của httpServletRequest trong API bộ lọc. Cách mà tôi đang làm ngay bây giờ là như dưới đây. Có an toàn để tiêm servletRequest như trong đoạn dưới đây hay điều này sẽ gây ra một số loại vấn đề tương tranh? Nếu có nhiều yêu cầu đến trong conncurrently, sẽ servletRequest trong các yêu cầu khác nhau ghi đè lên nhau? Cảm ơn vì hlep của bạn.@Context HttpServletRequest phạm vi trong Jersey ContainerResponseFilter

public class LoggingFilter implements ContainerResponseFilter { 
@Context private HttpServletRequest servletRequest; 
@Override 
public ContainerResponse filter(final ContainerRequest req, final ContainerResponse resp) { 
String s = this.servletRequest.getAttribute("xxx"); 
.... 
} 
} 

Trả lời

6

Mục 9.1 (mới nhất, 5.1 trước đây) Concurrency của JAX-RS specification trạng thái:

Bối cảnh là Speci fi c một yêu cầu đặc biệt nhưng các trường hợp nhất định JAX-RS thành phần (các nhà cung cấp và các lớp tài nguyên với một vòng đời khác so với yêu cầu) có thể cần hỗ trợ nhiều yêu cầu đồng thời . Khi tiêm một thể hiện của một trong các loại được liệt kê trong Mục 9.2, cá thể được cung cấp PHẢI có khả năng chọn ngữ cảnh chính xác cho một yêu cầu cụ thể. Sử dụng proxy cục bộ là cách phổ biến để đạt được điều này.

Vì vậy, theo đặc điểm kỹ thuật, triển khai JAX-RS (ví dụ: Jersey) được yêu cầu để đảm bảo ngữ cảnh an toàn. Tiếp tục làm những gì bạn đang làm.

Xem thêm: Extract request attributes from container request of Jersey

+1

Cảm ơn bạn rất nhiều. Tôi không nghĩ mọi người sẽ trả lời câu hỏi của tôi quá nhanh. Điều này thực sự làm tôi ngạc nhiên và giải quyết vấn đề. – lorcel

6

Bạn an toàn. Khi bạn đang tiêm HttpServletRequest/HttpServletResponse bạn không phải đối phó với một cá thể cụ thể mà đúng hơn là với proxy thông qua đó bạn đang gọi các cuộc gọi trên một cá thể thực được lưu trữ trong đối tượng ThreadLocal. Mỗi yêu cầu được xử lý bởi một chuỗi riêng biệt có quyền truy cập vào chủ đề riêng của nó là HttpServletRequest/HttpServletResponse. Bên cạnh việc tiêm HttpServletRequest/HttpServletResponse bạn cũng có thể tiêm ThreadLocal<HttpServletRequest>/ThreadLocal<HttpServletResponse> và thông qua phương thức '#get() `, bạn có thể nhận được yêu cầu/đáp ứng thực sự yêu cầu của proxy.

+0

Cảm ơn bạn Michal. Thực ra tôi không nghĩ mọi người sẽ trả lời câu hỏi của tôi quá nhanh. Điều này thực sự làm tôi ngạc nhiên và giải quyết vấn đề. – lorcel