当前位置:编程学习 > JAVA >>

HttpServletRequestWrapper过滤请求中的参数问题

由于项目需求,要对所有请求中的参数进行过滤,我用了HttpServletRequestWrapper这个接口,因为request中参数的值不可以修改。在正常URL中的参数都能正常过滤掉,问题在于STRUTS中 的forward。如果用forward跳转带的参数在过滤的时候就会丢失参数。这个问题还有什么好的解决方法? --------------------编程问答-------------------- public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
if (ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if (encoding != null) {
request.setCharacterEncoding(encoding);
}
}
HttpServletRequest req=(HttpServletRequest)request;
FilterSQL filterSQL=new FilterSQL(req,req.getParameterMap());
chain.doFilter(filterSQL, response);
}

这个事过滤器中的方法


public class FilterSQL extends HttpServletRequestWrapper {
private Map params;

public FilterSQL(HttpServletRequest request, Map newParams) {
super(request);
this.params = newParams;
}

public Map getParameterMap() {
return params;
}

public Enumeration getParameterNames() {
Vector l = new Vector(params.keySet());
return l.elements();
}

public String[] getParameterValues(String name) {
Object v = params.get(name);
if (v == null) {
return null;
} else if (v instanceof String[]) {
String[] a = (String[]) v;
String[] b = new String[] {};
for (int i = 0; i < a.length; i++) {
String c = filter(a[i].toString());
b[i] = c;
}
return b;
} else if (v instanceof String) {
String[] a = (String[]) v;
String b = filter(a[0]);
return new String[] { (String) b };
} else {
return new String[] { filter(v.toString()) };
}
}

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 filter(strArr[0]);
} else {
return null;
}
} else if (v instanceof String) {
return filter((String) v);
} else {
return filter(v.toString());
}
}

public String filter(String avaluelue) {
if (avaluelue == null) {
return null;
}
StringBuffer parm = new StringBuffer();
for (int i = 0; i < avaluelue.length(); ++i) {
char j = avaluelue.charAt(i);
if (j != '<' && j != '>' && j != '"' && j != '\'' && j != '%' && j != ';' && j != ')' && j != '(' && j != '+') {
parm.append(j);
}
}
return parm.toString().trim();
}
}
--------------------编程问答-------------------- 我猜想
forward是默认服务器端跳转,不走filter。 --------------------编程问答-------------------- 怎么会呢?所有请求都会进过滤器,现在的问题只是 带的参数丢失了,而且只是在调用HttpServletRequestWrapper这个以后才会有,把它注释丢就正常了。 --------------------编程问答-------------------- 服务器端跳转回经过Filter吗?
我一直认为不能啊。。。。。。 --------------------编程问答-------------------- 呵呵 不是有配置文件的嘛 /*就说明所有的请求都会进去吧。我在网上搜索了,很多都是同样的问题,但遗憾的是 都是未解决。实现不行的话只有想别的方法进行过滤了 --------------------编程问答-------------------- 没有人知道么? --------------------编程问答-------------------- 也遇到了此问题,服务器forward时确时不走filter了,我测了。
补充:Java ,  Java EE
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,