2013-05-31 33 views
4

我有一個過濾器來驗證/授權REST調用。這個過濾器需要訪問請求參數,所以我爲此寫了一個自定義的HTTPServletRequestWrapper。使用HTTPServletRequestWrapper封裝請求參數

import java.util.Collections; 
import java.util.Enumeration; 
import java.util.HashMap; 
import java.util.Map; 

import javax.servlet.ServletRequest; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletRequestWrapper; 

public class WrapperRequest extends HttpServletRequestWrapper { 
    private Map<String, String[]> requestParams = null; 

    public WrapperRequest(final ServletRequest request) { 
     super((HttpServletRequest) request); 

    } 

    @Override 
    public String getParameter(final String name) { 
     if (getParameterMap().get(name) != null) { 
      return getParameterMap().get(name)[0]; 
     } else { 
      getParameterMap().get(name)[0] = super.getParameter(name); 
      requestParams.put(name, getParameterMap().get(name)); 
      return requestParams.get(name)[0]; 
     } 

    } 

    @Override 
    public Map<String, String[]> getParameterMap() { 
     if (requestParams == null) { 
      requestParams = new HashMap<String, String[]>(); 
      requestParams.putAll(super.getParameterMap()); 
     } 
     return Collections.unmodifiableMap(requestParams); 
    } 

    @Override 
    public Enumeration<String> getParameterNames() { 
     return Collections.enumeration(getParameterMap().keySet()); 
    } 

    @Override 
    public String[] getParameterValues(final String name) { 
     return getParameterMap().get(name); 
    } 
} 

在我的過濾器doFilter方法:

public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain chain) throws IOException, ServletException { 


    final WrapperRequest wrappedRequest = new WrapperRequest(request); 
    Map<String, String[]> paramMap = wrappedRequest.getParameterMap(); 
    chain.doFilter(wrappedRequest, response); 

但我得到下面的警告

警告:servlet請求,到URI ,包含窗體在 參數請求主體,但請求主體已被消費 由servlet或訪問請求參數的servlet過濾器消耗。 只有使用@FormParam的資源方法才能按預期工作。資源 通過其他方式使用請求主體的方法將不會像預期的 那樣工作。

我在Tomcat中部署它。幫幫我!

回答

4

我認爲你使用Jersey作爲你的REST框架?

我想這基本上是說,由於Servlet已經構建了Request對象,澤西現在不能告訴窗體參數和查詢字符串參數之間的區別。

的一些細節請參見本:https://issues.apache.org/jira/browse/STANBOL-437

這引出了一個問題 - 就是這實際上造成您的問題還是你只是擔心警告信息嗎?

+0

是的,謝謝!這裏沒有問題。這只是一個警告。 – user2289898

2

沒錯。所以我一直在忍受這個問題,我一直試圖以不同的方式解決它,但我不想改變我的web.xml設置,僅僅因爲如果我用Postman測試我的應用程序,它的工作是完美的,但是當它被用在Web應用程序集成失敗並作爲@clijk提到提到的問題(A servlet request to the URI {MY_URI} contains form parameters in the request body but the request body has been consumed by the servlet or a servlet filter accessing the request parameters. Only resource methods using @FormParam will work as expected. Resource methods consuming the request body by other means will not work as expected.

所以,你只需要設置你的標題爲:

"Content-Type": "application/json" 
"charset": "UTF-8" 

,瞧,警告它的消失。

謝謝