关于使用装饰类、过滤器解决get请求乱码出现的500错误:non-HTTP request or response

最初:
全局过滤器的doFilter方法如下:关于使用装饰类、过滤器解决get请求乱码出现的500错误:non-HTTP request or response
自定义请求装饰类MyServletRequest代码如下:(主要是重写了getParameter方法)
关于使用装饰类、过滤器解决get请求乱码出现的500错误:non-HTTP request or response
启动服务器,访问服务器中的JSP页面,会出现错误:
non-HTTP request or response
错误出现在关于使用装饰类、过滤器解决get请求乱码出现的500错误:non-HTTP request or response


分析:
将myServletRequest更换成req时不会报错,可知错误与myServletRequest有关。

实际上:过滤器的doFilter方法中的前两个参数是:
编译时类型:ServletRequest 运行时类型:HttpServletRequest
编译时类型:ServletResponse 运行时类型:HttpServletResponse

chain.doFilter(req,res) 方法会将两个参数强转成HttpServlet…并调用它们相对于Servlet…类特有的方法。

简单来说:错误的出现是因为myServletRequest对象无法强转成HttpServletRequest类型导致的。


查看源码发现:
ServletRequestWrapper,HttpServletRequestWrapper,MyServletRequest三个类的关系如下(走右边的路)。
关于使用装饰类、过滤器解决get请求乱码出现的500错误:non-HTTP request or response
此时MyServletRequest与HttpServletRequest同为ServletRequestWrapper的子类,所以MyServletRequest无法强转成HttpServletRequest。

解决办法:让MyServletRequest继承HttpServletRequestWrapper类,而不是ServletRequestWrapper类
关于使用装饰类、过滤器解决get请求乱码出现的500错误:non-HTTP request or response
关于使用装饰类、过滤器解决get请求乱码出现的500错误:non-HTTP request or response
谢谢大家。

相关文章:

  • 2022-12-23
  • 2021-12-29
  • 2022-12-23
  • 2021-08-29
  • 2022-12-23
  • 2021-11-21
  • 2021-09-27
猜你喜欢
  • 2022-12-23
  • 2021-12-17
  • 2022-01-01
  • 2022-12-23
  • 2022-12-23
  • 2021-12-25
  • 2022-03-02
相关资源
相似解决方案