是否可以添加到请求的可用参数(HttpServletRequest)
我想拦截过滤器/ servlet中的请求并向其添加一些参数。但是,请求不会公开'setParameter'方法,并且在操作时会抛出一个错误,表示它被锁定。有没有其他方法可以尝试?是否可以添加到请求的可用参数(HttpServletRequest)
子类HttpServletRequestWrapper
并重写getParameter
方法。这个类的描述如下:
提供了一个方便的HttpServletRequest接口实现,可以由希望将请求调整为Servlet的开发人员实现。
在筛选器中,将请求包装在您的子类的实例中。
首先,您应该收到请求并读取其所有参数。 然后用原始参数+新的参数构造另一个请求并再次发送。
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);
}
谢谢:)。这工作。 – 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);
}
}
}
谢谢:)。这工作。 – 2008-10-10 14:10:02
你能提供一个例子吗? – 2013-03-26 15:26:36
公用类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