是否可以添加到请求的可用参数(HttpServletRequest)

问题描述:

我想拦截过滤器/ servlet中的请求并向其添加一些参数。但是,请求不会公开'setParameter'方法,并且在操作时会抛出一个错误,表示它被锁定。有没有其他方法可以尝试?是否可以添加到请求的可用参数(HttpServletRequest)

子类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

首先,您应该收到请求并读取其所有参数。 然后用原始参数+新的参数构造另一个请求并再次发送。

HttpServletRequest是不可变的,没有办法改变它。

我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

否则,您可以使用强类型的setAttribute()方法。因此,可以使用getAttribute()方法...

为什么不直接将变量存储为请求范围属性,而不是将它们附加到请求参数中?

您可以将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); 
    } 
} 
}