HttpServletRequestWrapper过滤请求中的参数问题

accpjiangwei 2009-09-16 01:58:47
由于项目需求,要对所有请求中的参数进行过滤,我用了HttpServletRequestWrapper这个接口,因为request中参数的值不可以修改。在正常URL中的参数都能正常过滤掉,问题在于STRUTS中 的forward。如果用forward跳转带的参数在过滤的时候就会丢失参数。这个问题还有什么好的解决方法?
...全文
861 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ocean1010 2011-10-14
  • 打赏
  • 举报
回复
也遇到了此问题,服务器forward时确时不走filter了,我测了。
accpjiangwei 2009-09-16
  • 打赏
  • 举报
回复
没有人知道么?
accpjiangwei 2009-09-16
  • 打赏
  • 举报
回复
呵呵 不是有配置文件的嘛 /*就说明所有的请求都会进去吧。我在网上搜索了,很多都是同样的问题,但遗憾的是 都是未解决。实现不行的话只有想别的方法进行过滤了
huguang 2009-09-16
  • 打赏
  • 举报
回复
服务器端跳转回经过Filter吗?
我一直认为不能啊。。。。。。
accpjiangwei 2009-09-16
  • 打赏
  • 举报
回复
怎么会呢?所有请求都会进过滤器,现在的问题只是 带的参数丢失了,而且只是在调用HttpServletRequestWrapper这个以后才会有,把它注释丢就正常了。
huguang 2009-09-16
  • 打赏
  • 举报
回复
我猜想
forward是默认服务器端跳转,不走filter。
accpjiangwei 2009-09-16
  • 打赏
  • 举报
回复
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();
}
}

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧