关于使用装饰类、过滤器解决get请求乱码出现的500错误:non-HTTP request or response
最初:
全局过滤器的doFilter方法如下:
自定义请求装饰类MyServletRequest代码如下:(主要是重写了getParameter方法)
启动服务器,访问服务器中的JSP页面,会出现错误:
non-HTTP request or response
错误出现在
分析:
将myServletRequest更换成req时不会报错,可知错误与myServletRequest有关。
实际上:过滤器的doFilter方法中的前两个参数是:
编译时类型:ServletRequest 运行时类型:HttpServletRequest
编译时类型:ServletResponse 运行时类型:HttpServletResponse
chain.doFilter(req,res) 方法会将两个参数强转成HttpServlet…并调用它们相对于Servlet…类特有的方法。
简单来说:错误的出现是因为myServletRequest对象无法强转成HttpServletRequest类型导致的。
查看源码发现:
ServletRequestWrapper,HttpServletRequestWrapper,MyServletRequest三个类的关系如下(走右边的路)。
此时MyServletRequest与HttpServletRequest同为ServletRequestWrapper的子类,所以MyServletRequest无法强转成HttpServletRequest。
解决办法:让MyServletRequest继承HttpServletRequestWrapper类,而不是ServletRequestWrapper类
谢谢大家。