关于自定义过滤类和getRequestDispatcher同时使用会产生无限请求的问题求解答

counting___star 2017-09-22 05:55:08
写了个简单的网上商城(jsp+servlet)
然后为了方便解决乱码问题写了个过滤类
package com.chenjunquan.filter;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;



public class EncodingFilter implements Filter {

@Override
public void destroy() {


}

@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {

// 处理请求乱码
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
ServletRequest myRequest = new MyRequest(httpServletRequest);

// 处理响应乱码
response.setContentType("text/html;charset=utf-8");

chain.doFilter(myRequest, response);

}

@Override
public void init(FilterConfig filterConfig) throws ServletException {
// XXX Auto-generated method stub

}

}

class MyRequest extends HttpServletRequestWrapper {
// 用于接收被包装对象引用
private HttpServletRequest request;
// 标记是否已经运行过get过滤
// 因为运行getParameter()方法一次就能转化全部属性值
private boolean flag = false;

public MyRequest(HttpServletRequest request) {
// 因为父类没有无参数构造
super(request);
// 接收被包装对象引用
this.request = request;
System.out.println("是不是你在搞事");
}


/**
* 将Map里面的数组转化为用UTF-8编码
* 1判断表单请求方式,如果是post则直接setCharacterEncoding("UTF-8");即可
* 2如果为get方式则先判断之前设置的标记是否为false
* 3false表示未过滤,遍历整个map集合
* 4将集合内的每个value值即为String[]数组全部取出
* 5将数组里面每个string字符串转化成UTF-8编码再放回去
* 6返回map
*/
public Map<String, String[]> getParameterMap() {

Map<String, String[]> map = request.getParameterMap();
String method = request.getMethod();
if ("post".equalsIgnoreCase(method)) {
try {
request.setCharacterEncoding("UTF-8");
return map;
} catch (UnsupportedEncodingException e) {

e.printStackTrace();
}
}
if ("get".equalsIgnoreCase(method)) {
// 如果是否已过滤的标识为false
if (!flag) {
// 遍历整个map集合
for (Map.Entry<String, String[]> e : map.entrySet()) {
String[] strs = e.getValue();
for (int i = 0; i < strs.length; i++) {
try {
// 将数组里面每个string字符串转化成UTF-8编码再放回去
strs[i] = new String(
strs[i].getBytes("ISO-8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e1) {
// XXX Auto-generated catch block
e1.printStackTrace();
}
}
}
// 修改标记为已过滤
flag = true;
}
return map;
}
return map;

}

@Override
public String getParameter(String name) {

if (getParameterMap().get(name)[0] == null) {
return null;
}
return getParameterMap().get(name)[0];
}

@Override
public String[] getParameterValues(String name) {
// XXX Auto-generated method stub

return getParameterMap().get(name);
}

}

接着在request分发转向的时候
如果是request.getRequestDispatcher("/admin/products/list.jsp").include(request, response);这种不带参数的就没有问题
如果是这个带有参数的request.getRequestDispatcher("/product?method=listProduct").forward(request, response);分发转向就会无限发送请求最终溢出


java.lang.reflect.InvocationTargetException
at sun.reflect.GeneratedMethodAccessor80.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.itheima.product.web.servlet.BaseServlet.service(BaseServlet.java:26)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:743)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:485)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:410)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:337)
at com.itheima.product.web.servlet.UserServlet.login(UserServlet.java:59)
at sun.reflect.GeneratedMethodAccessor80.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.itheima.product.web.servlet.BaseServlet.service(BaseServlet.java:26)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:743)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:485)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:410)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:337)
at com.itheima.product.web.servlet.UserServlet.login(UserServlet.java:59)
at sun.reflect.GeneratedMethodAccessor80.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.itheima.product.web.servlet.BaseServlet.service(BaseServlet.java:26)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:743)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:485)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:410)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:337)
at com.itheima.product.web.servlet.UserServlet.login(UserServlet.java:59)
at sun.reflect.GeneratedMethodAccessor80.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.itheima.product.web.servlet.BaseServlet.service(BaseServlet.java:26)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:743)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:485)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:410)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:337)
at com.itheima.product.web.servlet.UserServlet.login(UserServlet.java:59)
at sun.reflect.GeneratedMethodAccessor80.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.itheima.product.web.servlet.BaseServlet.service(BaseServlet.java:26)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:743)
错误信息非常多,完全不能理解到底是什么问题,只知道如果不使用过滤就不会发生问题问题
希望各位大神能替我解答,谢谢大家


...全文
1446 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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