MVC过滤器
什么是拦截器
Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。在SpringMVC中通过实现HandlerInterceptor接口实现自定义拦截器类。
拦截器可以做什么
拦截器可以用于权限验证、解决乱码、操作日志记录、性能监控、异常处理
自定义拦截器
public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception { //对浏览器的请求进行放行处理 System.out.println("preHandle===="); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object o, ModelAndView modelAndView) throws Exception { System.out.println("postHandle===="); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) throws Exception { System.out.println("afterCompletion===="); } }
接口中实现的三个方法
preHandle() 方法:该方法会在控制器方法前执行,其返回值表示是否中 断后续操作。当其返回值为true时,表示继续向下执行;当其返回值为false时,会中断后续的所有操作(包括调用下一个拦截器和控 制器类中的方法执行等)。
postHandle()方法:该方法会在控制器方法调用之后,且解析视图之前执 行。可以通过此方法对请求域中的模型和视图做出进一步的修改。
afterCompletion()方法:该方法会在整个请求完成,即视图渲染结束之 后执行。可以通过此方法实现一些资源清理、记录日志信息等工作。
拦截器配置
<mvc:interceptors> <mvc:interceptor> <!--拦截器映射的URL--> <mvc:mapping path="/**"/> <!--配置拦截器类--> <bean class="com.cmy.inter.InterTest"></bean> </mvc:interceptor> </mvc:interceptors>
拦截器和过滤器的区别
1、过滤器
依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等。
2、拦截器
依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。
使用拦截器解决CSRF攻击
1、CSRF:CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。
2、CSRF可以做什么:你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账……造成的问题包括:个人隐私泄露以及财产安全。
解决案例
导入依赖:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.3.2</version> </dependency>
编写拦截器:
package com.cmy.inter; import org.apache.commons.lang3.StringUtils; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class InterTest implements HandlerInterceptor { @Override //调用控制器方法之前调用的函数 //鉴权 过滤敏感词的操作 public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { //获取session对象 HttpSession session=httpServletRequest.getSession(); //获取内部的安全随机数 String session_csrf = String.valueOf(session.getAttribute("_csrf")); //根据用户请求传递而来的安全随机数 String request_csrf = httpServletRequest.getParameter("_csrf"); System.out.println(session_csrf+"===session"); System.out.println(request_csrf+"===request"); //移除安全随机数 //session.removeAttribute("_csrf"); //判断非空 安全的情况下 if (StringUtils.isNotBlank(session_csrf)&&StringUtils.isNotBlank(request_csrf)&&session_csrf.equals(request_csrf)){ return true; }else{ httpServletResponse.setContentType("text/html;charset=utf-8"); httpServletResponse.setStatus(403); //处理跨域状态码 httpServletResponse.getWriter().write("请不要重复提交请求,如有疑问,请联系客服"); return false; } } @Override //调用完控制器方法之后调用的函数 //记录用户日志的功能 public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { System.out.println("postHandle控制器方法之后=====2222222222"); } @Override //数据渲染到视图结束后调用的函数 public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { System.out.println("afterCompletion渲染视图之后=====3333333333"); } }
spring-mvc配置:
<mvc:interceptors> <mvc:interceptor> <!--拦截器映射的URL--> <mvc:mapping path="/**"/> <!--配置拦截器类--> <bean class="com.cmy.inter.InterTest"></bean> </mvc:interceptor> </mvc:interceptors>
原文地址:https://www.cnblogs.com/wnwn/p/11839873.html
- 北京允许无人驾驶路测 难道是为方便圣诞老人送礼?
- 小程序新增多项功能,优化100多个功能点,堪称重磅!
- 人工智能的回报率:对冲基金嵌入机器学习?
- “人工智能助力上海科创中心建设”国际高峰论坛圆满结束
- 纳米白与Pandas
- 人工智能来了!实体零售会变成什么样?
- 全国计算机等级考试重大改革!新增Python科目
- 福特:相比美国人中国人更欢迎自动驾驶未来
- Zzreal的大数据笔记-SparkDay03
- 一文读懂公有链、私有链、联盟链
- 你开车低头看个微信消息都能被拍的清清楚楚,因为有这些黑科技
- 开启程序员世界的Hello World
- TensorFlow实战——图像分类神经网络模型
- SQL,一门不是语言的语言?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法