赵走x博客
网站访问量:151829
首页
书籍
软件
工具
古诗词
搜索
登录
32、使用MyBatis注解实现数据库操作
31、MyBaties使用XML配置文件实现数据库操作
30、Spring Boot构建MyBatis应用程序
29、MyBatis简介
28、实战:实现JdbcTemplate多数据源
27、使用JdbcTemplate操作数据库
26、JdbcTemplate入门
25、实战:实现Web API版本控制
24、使用Swagger生成Web API文档
23、Thymeleaf页面布局
22、Thymeleaf内置对象、内嵌变量
21、Thymeleaf内联
20、Thymeleaf语法
19、Thymeleaf表达式
18、Thymeleaf入门
17、全局异常处理
16、实战:实现优雅的数据返回
15、跳转指定页面
14、Spring Boot静态资源
13、Spring Boot数据转换配置
12、跨域访问
11、Web配置
10、过滤器
9、拦截器
8、数据验证
7、参数传递
6、URL映射
5、@ResponseBody
4、@RequestMapping
3、@Controller和@RestController
2、Web项目结构
1、spring-boot-starter-web介绍
9、拦截器
资源编号:551772
热度:114
9、拦截器
拦截器在Web系统中非常常见,一般用于拦截用户请求,实现访问权限控制、日志记录、敏感过滤等功能。 本节首先介绍实际项目中拦截器的应用场景,然后介绍如何实现自定义拦截器的功能。 # 一、应用场景 拦截器在实际的应用开发中非常常见,对于某些全局统一的操作,我们可以把它提取到拦截器中实现。 总结起来,拦截器大致有以下几种使用场景: - 1)权限检查:如登录检测,进入处理程序检测是否登录,如果没有,则直接返回登录页面。 - 2)性能监控:有时系统在某段时间莫名其妙很慢,可以通过拦截器在进入处理程序之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如Apache,可以自动记录) - 3)通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有提取Locale、Theme信息等,只要是多个处理程序都需要的,即可使用拦截器实现。 - 4)OpenSessionInView:如Hibernate,在进入处理程序时打开Session(会话),在完成后关闭Session。 # 二、HandlerInterceptor简介 Spring Boot定义了HandlerInterceptor接口来实现自定义拦截器的功能。 HandlerInterceptor接口定义了preHandle、postHandle、afterCompletion三种方法,通过重写这三种方法实现请求前、请求后等操作。 - 1)preHandle:预处理回调方法实现处理程序的预处理(如登录检查),第三个参数为响应的处理程序(如第3章的控制器的实现)。 返回值: true表示继续流程(如调用下一个拦截器或处理程序); false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理程序,此时需要通过response来产生响应 2)postHandle:后处理回调方法,实现处理程序的后处理(但在渲染视图之前),此时可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。 3)afterCompletion:整个请求处理完之后回调方法,即在视图渲染完毕时回调,如在性能监控中,可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但是只调用处理程序执行preHandle,返回true所对应的拦截器的afterCompletion。 有时我们只需要实现3种回调方法之一,如果实现HandlerInterceptor接口,则无论是否需要3种方法都必须实现,此时Spring提供了一个HandlerInterceptorAdapter适配器(一种适配器设计模式的实现),允许我们只实现需要的回调方法。 # 三、使用HandlerInterceptor实现拦截器 我们在访问某些需要授权的页面,如订单详情、订单列表等需要用户登录后才能查看的功能时,需要对这些请求拦截,进行登录检测,符合规则的才允许请求通过。 接下来通过登录状态检测的例子演示拦截器的使用。首先,创建自定义登录拦截器,示例代码如下: ``` public class LoginInterceptor implements HandlerInterceptor { /*注册拦截器*/ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Object user = request.getSession().getAttribute("user"); if (user == null){ request.setAttribute("msg","您没有权限这么做!"); request.getRequestDispatcher("/").forward(request,response); return false; } return true; } } ``` 在上面的示例中,LoginInterceptor继承HandlerInterceptor接口,实现preHandle接口,验证用户的Session状态。 如果当前用户有登录信息,则可以继续访问;如果当前用户没有登录信息,则返回无权限。 然后,将拦截器注入系统配置。定义MyMvcConfig配置类,将上面定义的LoginInterceptor拦截器注入系统中,示例代码如下: ``` @Configuration public class MyMvcConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoginInterceptor()) .addPathPatterns("/**").excludePathPatterns("/", "/user/login","/asserts/**","/webjars/**"); } } ``` 通过WebMvcConfigurer类的addInterceptors方法将刚刚自定义的LoginInterceptor拦截器注入系统中。 addPathPatterns定义拦截的请求地址。 excludePathPatterns的作用是排除某些地址不被拦截,例如登录地址/user/login不需要进行登录验证。