上一篇文章中讲到了如何防御xss脚本攻击的方法。这一集详细介绍具体方法:
只需要写过滤器,去拦截每个请求,对每个不为空的参数,实现一个特殊字符的过滤。
和拦截器的区别:
aop也是可以的,它是springboot自带的,但是过滤器比较推荐。因为拦截器属于serverlet中没有的概念。
过滤器(Filter)是Servlet的加强版,通过实现javax.servlet.Filter接口来增强功能。它主要用于对用户请求进行预处理,例如检查用户授权、记录日志信息、解码和过滤字符编码等。过滤器在Web应用启动时初始化一次,并在整个生命周期内处理请求,直到应用停止或重新部署时销毁。
使用Filter的流程包括:1)对用户请求进行预处理;2)将请求交给Servlet处理并生成响应;3)对服务器响应进行后处理。为创建Filter,需要实现javax.servlet.Filter接口,该接口定义了三个方法:init()用于Filter的初始化;doFilter()用于实现过滤功能,即对每个请求增加额外的处理;destroy()用于回收资源。
doFilter()方法用于实现用户请求的预处理和服务器响应的后处理。预处理和后处理的分界线为是否调用了chain.doFilter()方法,调用之前是预处理,调用之后是后处理。
拦截器属于SpringMvc提供拦截请求框架,但是最上一层,是过滤器先执行,因为先找到过滤器,然后再去走到拦截器。
过滤器---------拦截器
方法:
自己封装一些aop,通过aop去拦截方法,在方法前后做处理。aop的底层就是对一些过滤进行封装。
直接用StringEscapeUtils方法里面底层的源码,都已经帮我们封装好了,拿到一个newValue,这个代码的方法会对一些特殊字符进行转译。
然后在filter类中,我们过滤后要进行房型,传递request对象和response类,以下
是进行放行的代码:
拦截器(Interceptor)在AOP编程中用于在方法或字段被访问前进行拦截,可在其前后执行一些操作。拦截器常用于实现诸如权限管理和日志服务等共用行为。在Spring MVC中,要使用拦截器需要实现org.springframework.web.servlet.HandlerInterceptor接口,该接口定义了三个方法:
- preHandle():在请求处理之前调用,链式调用多个拦截器。根据声明顺序依次执行,可以进行前置处理和判断是否继续执行。返回false时,请求结束;返回true时,继续调用下一个拦截器的preHandle方法,最终执行Controller方法。
- postHandle():在Controller方法调用后,视图渲染前调用。可以对处理后的ModelAndView进行操作。执行顺序与preHandle相反,先声明的Interceptor的postHandle方法后执行。
- afterCompletion():在整个请求结束后调用,即视图渲染后。主要用于资源清理。
两者执行顺序如下图:
拦截器(Interceptor)和过滤器(Filter)的本质区别在于:拦截器基于Java的反射机制,而过滤器基于函数回调。拦截器功能相对更强大且灵活,可以在请求前后执行,而过滤器主要用于处理URL地址编码、过滤无用参数和安全校验等较泛的任务。在需要处理细节方面,建议使用拦截器。根据不同情况,选择适合的技术。但是对于这里的xss脚本攻击进行防御,那么应该使用过滤器,这是比较推荐的,物尽其用。
过滤器的具体实现:
springboot中的@WebFilter再注入@Component容器中,再在主函数中取实现Filter接口,使用"在IntelliJ IDEA中,快速实际接口方法可以使用快捷键Ctrl + I。按下快速快捷键后,会弹出“实现方法”对话框,其中列出了当前类所实际的接口方法列表。" 这个方法快速生成methods,拦截所有请求,并过滤静态资源,比如带大于号小于号全部进行转译。
这里我们还需要定义一个HttpServletRequestWrapper的类,这个类的核心用来,一旦调用参数,就会进行类里的回调。
过滤器的底层:
采用责任链的模式,最后才是自己定义的过滤器,拿到username后,把特殊字符进行转译,然后在页面展示脚本,相当于文字,不再是执行脚本。
文中引用到了一篇文章:拦截器(Interceptor)和过滤器(Filter)的执行顺序和区别_过滤器和拦截器的执行顺序_止步前行的博客-CSDN博客
(关于拦截器(Interceptor)和过滤器(Filter)的执行顺序和区别)
好了,今天分享到这里。
同步关注github:uqcharles.Github.io
喜欢的点赞关注,转载请说明来源。