Spring Boot配置拦截器
1. 什么是拦截器
拦截器对使用SpringMvc、Struts的开发人员来说特别熟悉,因为你只要想去做好一个项目必然会用到它。拦截器在我们平时的项目中用处有很多,如:日志记录(我们后续章节会讲到)、用户登录状态拦截、安全拦截等等。而SpringBoot内部集成的是SpringMVC控制框架,所以使用起来跟SpringMVC没有区别,只是在配置上有点不同。废话不多说,我们开始我们本章的内容!
在 Spring Boot 项目中,使用拦截器功能通常需要以下 3 步:
定义拦截器;
注册拦截器;
指定拦截规则(如果是拦截所有,静态资源也会被拦截)。
2. 跟踪访问行为
要想实现对访问的拦截,首先要能跟踪访问行为,我们在 Spring Boot 中引入拦截器来实现下。
2.1 使用 Spring Initializr 创建项目
Spring Boot 版本选择 2.2.5 ,Group 为 com.imooc , Artifact 为 spring-boot-interceptor ,生成项目后导入 Eclipse 开发环境。
2.2 引入项目依赖
引入 Web 项目依赖即可。
实例:
<!-- web项目依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
2.3 创建拦截器
创建的类实现 HandlerInterceptor 接口,即可成为拦截器类.
实例:
/** * 自定义拦截器类 */public class MyInterceptor implements HandlerInterceptor {// 实现HandlerInterceptor接口 /** * 访问控制器方法前执行 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println(new Date() + "--preHandle:" + request.getRequestURL()); return true; } /** * 访问控制器方法后执行 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println(new Date() + "--postHandle:" + request.getRequestURL()); } /** * postHandle方法执行完成后执行,一般用于释放资源 */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println(new Date() + "--afterCompletion:" + request.getRequestURL()); }}
在上面的实例中,我们定义了一个拦截器类 MyInterceptor ,通过实现 HandlerInterceptor 接口,该类具备了拦截器的功能。
MyInterceptor 中的方法执行顺序为 preHandle – Controller 方法 – postHandle – afterCompletion ,所以拦截器实际上可以对 Controller 方法执行前后进行拦截监控。
最后还有一个非常重要的注意点, preHandle 需要返回布尔类型的值。 preHandle 返回 true 时,对控制器方法的请求才能到达控制器,继而到达 postHandle 和 afterCompletion 方法;如果 preHandle 返回 false ,后面的方法都不会执行。
2.4 配置拦截器
上一步我们开发了配置器类,如果想让配置器生效,还需要通过配置类进行相应配置。
实例:
/** * Web配置类 */@Configurationpublic class WebConfig implements WebMvcConfigurer { /** * 添加Web项目的拦截器 */ @Override public void addInterceptors(InterceptorRegistry registry) { // 对所有访问路径,都通过MyInterceptor类型的拦截器进行拦截 registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**"); }}
2.5 创建控制器
我们建立一个简单的控制器,实现登录方法,以便检验拦截器的效果。
实例:
/** * 登录控制器 */@RestControllerpublic class LoginController { @RequestMapping("/login") public boolean login(String username, String password) { System.out.println(new Date() + " 某用户尝试登录,用户名:" + username + " 密码:" + password); return true; }}
2.6 跟踪访问行为
运行启动类,访问 http://127.0.0.1:8080/login?username=imooc&password=123
,控制台输出如下:
可见我们已经完整的跟踪了一次对 http://127.0.0.1:8080/login
接口的访问。
3. 实现访问控制
区分合法、非法访问,最常见的就是根据用户的登录状态、角色判断。接下来我们就演示下,对未登录用户非法访问请求的拦截。
3.1 修改控制器方法
修改登录方法,当用户输入的用户名和密码正确时,通过 Session 记录登录人信息。
然后开发获取登录人员信息方法,返回 Session 中记录的登录人信息。
实例:
/** * 登录控制器 */@RestControllerpublic class LoginController { /** * 登录方法 */ @RequestMapping("/login") public boolean login(HttpServletRequest request, String username, String password) { if ("imooc".equals(username) && "123".equals(password)) { // 登录成功,则添加Session并存储登录用户名 request.getSession().setAttribute("LOGIN_NAME", username); return true; } return false; } /** * 获取登录人员信息 */ @RequestMapping("/info") public String info(HttpServletRequest request) { return "您就是传说中的:" + request.getSession().getAttribute("LOGIN_NAME"); }}
3.2 修改拦截器方法
由于用户在登录之前还没有设置 Session ,所以登录方法不应该拦截,可以让用户自由请求。但是只有登录成功后的用户,也就是说具备 Session 的用户才能访问 info 方法。
实例:
/** * 自定义拦截器类 */public class MyInterceptor implements HandlerInterceptor {// 实现HandlerInterceptor接口 /** * 访问控制器方法前执行 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (request.getRequestURI().contains("/login") == true) {// 登录方法直接放行 return true; } else {// 其他方法需要先检验是否存在Session if (request.getSession().getAttribute("LOGIN_NAME") == null) {//未登录的不允许访问 return false; } else { return true; } } }}
3.3 测试
首先直接请求 http://127.0.0.1:8080/info
,由于此时未登录,所以请求被拦截,网页输出如下:
如果先请求登录方法 http://127.0.0.1:8080/login?username=imooc&password=123
,然后访问 http://127.0.0.1:8080/info
,则网页输出:
原文链接: https://www.yukx.com/spring/article/details/2147.html 优科学习网Spring Boot配置拦截器
-
在HTML中,如果你想让一个输入框(input元素)不可编辑,你可以通过设置其readonly属性来实现。示例如下:input type="text" value="此处内容不可编辑" readonly在上述代码中,readonly属性使得用户无法修改输入框中的内容。另外,如果你希望输入框完全不可交
-
ASP.NET教程ASP.NET又称为ASP+,基于.NETFramework的Web开发平台,是微软公司推出的新一代脚本语言。ASP.NET是一个使用HTML、CSS、JavaScript和服务器脚本创建网页和网站的开发框架。ASP.NET支持三种不一样的开发模式:WebPages(Web页面)、
-
C# 判断判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。下面是大多数编程语言中典型的判断结构的通常形式:判断语句C#提供了以下类型的判断语句。点击链接查看每个语句的细节。语句描述if语句一个 if语句 由一个布尔表达式后跟
-
C#循环有的时候,可能需要多次执行同一块代码。通常情况下,语句是顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推。编程语言提供了允许更为复杂的执行路径的多种控制结构。循环语句允许我们多次执行一个语句或语句组,下面是大多数编程语言中循环语句的通常形式:循环类型C#提供了以下几种循环类型
-
C#数组(Array)数组是一个存储相同类型元素的固定大小的顺序集合。数组是用来存储数据的集合,一般认为数组是一个同一类型变量的集合。声明数组变量并不是声明number0、number1、...、number99一个个单独的变量,而是声明一个就像numbers这样的变量,然后使用numbers[0]
-
ASP.NET是一个由微软公司开发的用于构建Web应用程序的框架,它是.NETFramework的一部分。它提供了一种模型-视图-控制器(MVC)架构、Web表单以及最新的ASP.NETCore中的RazorPages等多种开发模式,可以用来创建动态网页和Web服务。以下是一些基础的ASP.NET编