2008-10-10 92 views

回答

12

子類HttpServletRequestWrapper並重寫getParameter方法。這個類的描述如下:

提供了一個方便的HttpServletRequest接口實現,可以由希望將請求調整爲Servlet的開發人員實現。

在篩選器中,將請求包裝在您的子類的實例中。

+0

謝謝:)。這工作。 – 2008-10-10 14:10:02

+0

你能提供一個例子嗎? – 2013-03-26 15:26:36

+0

公用類CustomHttpServletRequestWrapper擴展HttpServletRequestWrapper { \t private Map customParameters; \t public CustomHttpServletRequestWrapper(HttpServletRequest request){ \t \t super(request); \t} \t公共無效addCustomParameter(字符串名稱,字符串值){ \t \t customParameters。把(名字,價值); \t} \t @Override \t公共字符串的getParameter(字符串名稱){ \t \t字符串originalParameter = super.getParameter(名稱); \t \t if(originalParameter!= null){ \t \t \t return originalParameter; \t \t} else { \t \t \t return customParameters.get(name); \t \t} \t} } – Riccati 2015-07-15 15:38:17

1

首先,您應該收到請求並讀取其所有參數。 然後用原始參數+新的參數構造另一個請求並再次發送。

HttpServletRequest是不可變的,沒有辦法改變它。

6

我ussualy將原始的HttpServletRequest包裝成一個新的CustomHttpServletRequest,它充當原始請求的代理,然後將這個新的CustomHttpServletRequest傳遞給過濾器鏈。

在這個CustomHttpServletRequest中,你可以覆蓋getParameterNames,getParameter,getParameterMap方法來返回你想要的任何參數。

這是過濾器的一個示例:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    HttpServletRequest httpRequest = (HttpServletRequest) request; 
    HttpServletRequest customRequest = new CustomHttpServletRequest(httpRequest); 
    customRequest.addParameter(xxx, "xxx"); 
    chain.doFilter(customRequest, response); 
} 
+0

謝謝:)。這工作。 – 2008-10-10 14:10:37

-1

否則,您可以使用強類型的setAttribute()方法。因此,可以使用getAttribute()方法...

0

爲什麼不直接將變量存儲爲請求範圍屬性,而不是將它們附加到請求參數中?

1

您可以將HttpServletRequest包裝到新的HttpServletRequestWrapper對象中並覆蓋一些方法。

以下代碼來自http://www.ocpsoft.org/opensource/how-to-safely-add-modify-servlet-request-parameter-values/

要在過濾器中添加參數:

public class MyFilter implements Filter { 
... 
@Override 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    if (request instanceof HttpServletRequest) { 
     HttpServletRequest httprequest = (HttpServletRequest) request; 
     Map<String, String[]> extraParams = new HashMap<String, String[]>(); 
     extraParams.put("myparamname", String[] { "myparamvalue" }); 
     request = new WrappedRequestWithParameter(httprequest, extraParams); 
    } 
    chain.doFilter(request, response); 
} 
... 

class WrappedRequestWithParameter extends HttpServletRequestWrapper { 
    private final Map<String, String[]> modifiableParameters; 
    private Map<String, String[]> allParameters = null; 

    public WrappedRequestWithParameter(final HttpServletRequest request, final Map<String, String[]> additionalParams) { 
     super(request); 
     modifiableParameters = new TreeMap<String, String[]>(); 
     modifiableParameters.putAll(additionalParams); 
    } 

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

    @Override 
    public Map<String, String[]> getParameterMap() { 
     if (allParameters == null) { 
      allParameters = new TreeMap<String, String[]>(); 
      allParameters.putAll(super.getParameterMap()); 
      allParameters.putAll(modifiableParameters); 
     } 
     // Return an unmodifiable collection because we need to uphold the interface contract. 
     return Collections.unmodifiableMap(allParameters); 
    } 

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

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