request之所以不想让你修改parameter的值,就是因为这个东西一般不然改,有人问我为什么不让改,表面上说我只能说这属于篡改数据,因为这个使用户的请求数据,如果被篡改就相当于篡改消息,如果你一天给别人发消息发的是:你好,而对方收到的是:骂人得语言!,你会怎么想,呵呵!当然它主要是怕不安全把参数数据该乱了,因为程序员毕竟是自己写程序,尤其是在公共程序里面写,后台程序员发现自己的数据不对,也找不到原因;一般WEB应用会提供一个attribute来提供自己的参数设置,这样就OK了,但是有些人就是那么bian态说为啥就不能改呢,面向对象不是相互的么,有get应该有set的呀,我只能说,面向对象来自于生活现实,生活现实中每天逛大街,街上有很多形形色色如花似玉的,但是又可能你只能看,不能摸,更不能XX,呵呵,否则一个异常就出来了:臭牛氓!(转自http://www.importnew.com/19023.html)
解决方案: 继承HttpServletRequestWrapper,其实就是上面那种方法多了一层继承,将你的重复工作交予了它,让过滤链使用自定义request继续执行
代码如下
public class AMHttpServletRequestWrapper extends HttpServletRequestWrapper {
Map<String, String[]> params = null;
public AMHttpServletRequestWrapper(HttpServletRequest request, Map inParam) {
super(request);
params = new HashMap(inParam);
}
public void setParameter(String key, String value) {
params.put(key, new String[]{value});
}
public void setParameter(String key, String[] values) {
params.put(key, values);
}
@Override
public String getParameter(String name) {
Object v = params.get(name);
if (v == null) {
return null;
} else if (v instanceof String[]) {
String[] strArr = (String[]) v;
if (strArr.length > 0) {
return strArr[0];
} else {
return null;
}
} else {
return v.toString();
}
}
@Override
public Map<String, String[]> getParameterMap() {
return params;
}
@Override
public Enumeration<String> getParameterNames() {
Vector l = new Vector(params.keySet());
return l.elements();
}
@Override
public String[] getParameterValues(String name) {
return params.get(name);
}
}
过滤器方法:
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest http_req = (HttpServletRequest)request;
AMHttpServletRequestWrapper amHttpServletRequestWrapper = new AMHttpServletRequestWrapper(http_req, http_req.getParameterMap());
chain.doFilter(amHttpServletRequestWrapper, response);
}
在
amHttpServletRequestWrapper.setParameter( entry.getKey(), (String)entry.getValue());
设值即可
源码: https://github.com/gcWpengfei/spring-cloud-rsa-aes-demo/blob/master/aes-rsa-client/src/main/java/com/wpf/filter/RequestFilter.java
出处:https://blog.csdn.net/qq_33212500/article/details/80455565