2013-06-07 38 views
5

Mục tiêu của tôi là tất cả bên dưới URI sẽ hoạt độngTham số yêu cầu chuỗi truy vấn phân biệt chữ hoa chữ thường

https: // rest/xyz? sắp xếp = name

https: // rest/xyz? Sắp xếp = name

https: // rest/xyz? bộ lọc = name = value

https: // rest/xyz? Bộ lọc = name = value

Để đạt được điều này, tôi đã tạo bộ lọc tùy chỉnh ghi đè lên HttpServletRequest được chuyển đến Bộ lọcChọn. Dưới đây là liên kết cho cách tiếp cận này:

http://forum.springsource.org/archive/index.php/t-87433.html

Mã của tôi: getParameterValues ​​

import java.io.IOException; 
import java.util.Map; 

import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletRequestWrapper; 

public class HttpCustomParamFilter implements Filter 
{ 
    private static class HttpServletRequestCustomeWrapper extends HttpServletRequestWrapper 
    { 
     private String[] parameterValues; 

     @Override 
     public String[] getParameterValues(String name) 
     { 
      Map<String, String[]> localParameterMap = super.getParameterMap(); 

      // Handle case insensitivity of http request paramters like start, count, query, sort, filter etc. 
      if (localParameterMap != null && !localParameterMap.isEmpty()) 
      { 
       parameterValues = new String[localParameterMap.size()]; 
       for (String key : localParameterMap.keySet()) 
       { 
        if (name.equalsIgnoreCase(key)) 
         parameterValues = localParameterMap.get(key); 
        else 
         parameterValues = null; 
       } 
      } 
      return parameterValues; 
     } 

     public HttpServletRequestCustomWrapper(final ServletRequest request) 
     { 
      super((HttpServletRequest) request); 
     } 


    } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain chain) throws IOException, ServletException { 
     // override the request passed to the FilterChain 
     chain.doFilter(new HttpServletRequestCustomWrapper(request), response); 
     } 

    @Override 
    public void init(FilterConfig filterConfig) 
      throws ServletException 
    { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void destroy() 
    { 
     // TODO Auto-generated method stub 

    } 

} 

Trong mã này, tôi đã overriden (String name) phương pháp và đạt được trường vô cảm của yêu cầu paramters, nhưng không chắc chắn nếu tôi cần phải ghi đè lên bất kỳ phương pháp khác.

nghi ngờ của tôi:

  • làm tôi cần phải ghi đè lên các phương pháp khác cũng như getParameter() và getParameterNames()?

  • việc triển khai nội bộ nào bị ảnh hưởng với điều này?

  • lớp nào tôi có thể thấy việc triển khai mã getParameter(), getParameterNames() và getParameterValues ​​()?

+0

Với những vấn đề bạn có ở đây, có một giải pháp duy nhất là _sure_ không gây rối mọi thứ: sử dụng bố cục. – fge

Trả lời

2

Trước tiên, hãy để tôi nói hòa bình của tôi: Tôi không nghĩ rằng sửa đổi HttpServletRequestWrapper là cách để đi. Tôi thậm chí không chắc chắn làm thế nào bạn sẽ đi về việc sử dụng nó, như sự hiểu biết của tôi là nó App Server cụ thể. Như một lưu ý phụ, this article có các chi tiết cụ thể về cách sử dụng HttpServletRequest để có được một tham số truy vấn phân biệt chữ hoa chữ thường mà không cần phải di chuyển của riêng bạn.

Nhưng, theo tinh thần giải đáp thắc mắc của bạn:

  1. Bạn cần phải ghi đè getParameter() và getParameterNames()? Bạn có thể, vì nó sẽ cho bạn khả năng thao túng vụ án. Trong thực tế, tôi sẽ nói cách an toàn nhất để làm cho các tham số truy vấn không phân biệt chữ hoa chữ thường là ghi đè lên chỉ những phương thức đó. Thực hiện cuộc gọi getParameter() làm một trường hợp không phân biệt dạng chữ trên các tên chuỗi. Bạn không chắc chắn những gì bạn sẽ làm với getParameterNames(), có thể trả về mọi trường hợp có thể, nhưng điều này có vẻ dư thừa.
  2. Việc triển khai nội bộ nào bị ảnh hưởng bởi điều này? Tôi không chắc chắn. HttpServletRequest là cốt lõi đối với khá nhiều thứ, không có gì nói bạn có thể giới thiệu nếu mã của bạn không phải là 100% rắn. Ví dụ, Spring có SecurityContextHolderAwareRequestWrapper, vậy điều đó có nghĩa là bạn vừa phá vỡ Spring Security? Không nói mà không có nhiều thử nghiệm.
  3. Tôi có thể xem lớp nào khi triển khai mã getParameter(), getParameterNames() và getParameterValues ​​()? HttpServletRequestWrapper là chỉ thực hiện giao diện HttpServletRequest, theo JavaDocs.Việc triển khai thực tế của lớp này phụ thuộc vào vùng chứa ứng dụng của bạn. Ví dụ: trong ứng dụng weblogic.servlet.internal.ServletRequestImpl của tôi, vì tôi sử dụng Web Logic. Hy vọng rằng bạn đang sử dụng một máy chủ ứng dụng nguồn mở có mã sẵn có. Cách tôi tìm thấy điều này là để đặt một break trong một trong những phương pháp xử lý điều khiển của tôi đã HttpServletRequest xác định và xem nó getClass() phản ứng trong trình gỡ lỗi.
+0

Hey CodeChimp, cảm ơn. Đây là một trong những cách tiếp cận trong bài viết được đề xuất bởi bạn, nơi tôi đang viết bộ lọc tùy chỉnh của riêng tôi và chuyển yêu cầu http đến mùa xuân. trong khi đi qua mã mùa xuân, tôi thấy chỉ getParaNames được gọi và do đó ghi đè nó là giải quyết mục đích của tôi. tuy nhiên getParamter() có thể được sử dụng trong một số khung công tác khác mà tôi không biết nên không biết nó có bị ghi đè hay không. Tôi thấy việc thực hiện các phương pháp này trong mã máy chủ ứng dụng theo đề xuất của bạn, đó là cầu cảng trong trường hợp của tôi. – akhi

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