page contents

拦截器对request装饰后读取request值为空,过滤器可以正常读取

Pack 发布于 2020-02-06 18:06
阅读 458
收藏 0

拦截器中对request装饰,手动修改request内数据,但在controller层中读取后为空。同样的逻辑代码,过滤器装饰后可以正确读取。这里是什么原因呢


拦截器拦截处理:

 attachments-2020-02-r9ndz8Lc5e3be50e87d7d.png


request装饰者:

 attachments-2020-02-A7EPysB75e3be51a8ac4e.png


最后在controller中读取request时数据为空。


相同的装饰者,使用过滤器时候在controller中可以读取request中数据。

263
Pack
Pack

你要用装饰后的request取代原来的request!!!


ParameterRequestWrapper wrapper = new ParameterRequestWrapper((HttpServletRequest) servletRequest);

filterChain.doFilter(wrapper, response);


使用过滤器时候filterChain.doFilter(wrapper, response)这句代码用wrapper替代了原来的request,所以后续在拦截器、Controller可以收到这个wrapper。

你在拦截器写的return super.preHandle(requestWrapper,response,handler)只是将wrapper传给拦截器父类方法,并没有取代原来的request。

你要明白一件事情,拦截器、Controller底层还是Servlet,Servlet不能做的事情拦截器和Controller同样也不能做,而Filter不是基于Servlet,Filter和Servlet是各自独立的技术体系,没有从属关系,所以Filter可以做一些Servlet做不了的事件。

你如果在Servlet架构体系强行模拟Filter代码,只能貌似,不能神似!

请先 登录 后评论