2010-10-15 34 views
8

Tôi có một trường hợp mà tôi cần phải chuyển hướng đối tượng yêu cầu HTTP của tôi đến các bộ điều khiển/lớp khác để xử lý tiếp. Vấn đề là trong một số bộ điều khiển, tôi muốn kiểm soát tốt hơn các tham số mà tôi đang chuyển tiếp sang lớp tiếp theo: sửa đổi, chỉnh sửa, loại bỏ chúng. Vì vậy, tôi muốn biết nếu có một thực hành tốt/mô hình để đạt được điều khiển cơ bản này trên các tham số yêu cầu HTTP.cách tốt nhất để loại bỏ một tham số HttpServletRequest trong một bộ điều khiển/lớp học là gì?

Trả lời

17

Thực hành tốt là bọc đối tượng yêu cầu vào đối tượng khác bằng bộ lọc servlet. Kể từ HttpServletRequest là một giao diện, bạn có thể viết thực hiện của riêng bạn của nó. Việc triển khai của bạn có thể giữ yêu cầu bạn nhận được và ủy quyền bất kỳ và tất cả các phương thức riêng của nó cho đối tượng yêu cầu ban đầu, nhưng cũng sửa đổi các giá trị trả về khi bạn thấy phù hợp. Vì vậy, các phương thức getParameter() của bạn có thể gọi cùng một phương thức trên đối tượng yêu cầu ban đầu và sửa đổi kết quả khi bạn thấy phù hợp trước khi trả về nó.

class MyHttpServletRequestWrapper implements HttpServletRequest { 
    private HttpServletRequest originalRequest; 

    public MyHttpServletRequestWrapper(HttpServletRequest originalRequest) { 
     this.originalRequest = originalRequest; 

    public String getAuthType() {return originalRequest.getAuthType();} 
    public String getQueryString() {return originalRequest.getQueryString();} 
    // etc. 

    public Map getParameterMap() { 
     Map params = originalRequest.getParameterMap(); 
     params.remove("parameter-to-remove"); 
     params.put("parameter-to-add", "<a value>"); 
     //etc. 
    } 
} 

lọc servlet của bạn:

class MyFilter implements Filter { 
    public void init(FilterConfig config) { 
     // perhaps you might want to initialize something here 
    } 

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { 
     HttpServletRequest originalRequest = (HttpServletRequest) request; 
     HttpServletRequest newRequest = new MyHttpServletRequest(originalRequest); 
     chain.doFilter(newRequest, response); 
    } 
} 

Bạn cũng có thể phân lớp javax.servlet.request.HttpServletRequestWrapper, mà bạn sẽ tiết kiệm được một loạt các công việc.

Xem điều này post để biết thêm.

+2

Mặc dù bài đăng bạn liên kết chứa nhiều thông tin hơn, bạn nên xác định rằng điều này nên được thực hiện bằng bộ lọc (nếu đó là ý của bạn). – Vetle

+0

cảm ơn rất nhiều. tôi sẽ sử dụng các bộ lọc và lớp trình bao bọc cho đối tượng HttpRequest. –

2

Nếu bạn đang sau một đơn giản một-liner, regex kỹ thuật này làm việc cho tôi:

myURL = myURL.replaceAll("[&?]clear=([^&]$|[^&]*)", ""); 

Nếu bạn cần nó trong Javascript, nó rất giống thực sự - đó là tốt đẹp!

var myUrl = (""+window.location).replace(/&?clear=([^&]$|[^&]*)/i, ""); 

rõ ràng là tên của tham số phải được loại bỏ.

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