SpringBoot项目中如何实现登录拦截器
什么是拦截器?
拦截器(Interceptor),主要完成请求参数的解析、将页面表单参数赋给值栈中相应属性、执行功能检验、程序异常调试等工作。(百度百科)
前期准备
login.html登录页
1 <!DOCTYPE html> 2 <html lang="en" xmlns:th="http://www.thymeleaf.org"> 3 <head> 4 <!-- 5 使用了Thymeleaf模板引擎之后,所有的静态资源都要使用Thymeleaf提供的表达式来获取 6 例如: 7 ${} 变量 8 #{} message 9 @{} url 10 ~{} 11 不然的话,前端就会识别加载不出来这些引用的静态资源 12 13 尤其要注意的是:springboot中的template目录下的文件不能通过浏览器去直接请求,而是 14 要通过服务器内部去转发才能获取到 15 --> 16 <meta charset="UTF-8"> 17 <title>登录页面</title> 18 <link rel="stylesheet" th:href="@{/css/style.css}" /> 19 <script type="text/javascript" th:src="@{/js/jquery-3.4.1.js}"></script> 20 <script type="text/javascript"> 21 <!--入口函数 --> 22 $(function () { 23 var $errorSpan = $("#error-span"); 24 $("#submit_a").click(function () { 25 var $userName = $("#userName").val(); 26 var $password = $("#password").val(); 27 var $data = JSON.stringify({ 28 "userName": $userName, 29 "password": $password 30 }); 31 // 发送Ajax请求进行登录 32 $.ajax({ 33 method: "POST", 34 url: "/user/login", 35 data: $data, 36 dataType: "json", 37 contentType: "application/json", 38 success: function (data) { 39 if (data === "yes") { 40 window.location.href = "/main.html"; 41 } else { 42 $errorSpan.html("用户名或密码错误"); 43 } 44 }, 45 error: function (data) { 46 alert(data); 47 alert("服务器繁忙"); 48 } 49 }); 50 }); 51 }); 52 </script> 53 </head> 54 <body> 55 <!-- partial:index.partial.html --> 56 <div class="login-box"> 57 <h2>登录系统</h2> 58 <form th:action="@{/user/login}" method="post"> 59 <div class="user-box"> 60 <input type="text" id="userName" name="userName" required="" autocapitalize="none"/> 61 <label>用户名</label> 62 </div> 63 <div class="user-box"> 64 <input type="password" id="password" name="password" required="" autocapitalize="none"/> 65 <label>密码</label> 66 </div> 67 <a href="javascript:void(0);" id="submit_a"> 68 <span></span> 69 <span></span> 70 <span></span> 71 <span></span> 72 进入系统 73 </a> 74 75 <span id="error-span" th:text="${msg}" style="color: red"></span> 76 </form> 77 </div> 78 </body> 79 </html>
进入正题——SpringBoot项目中如何实现登录拦截器
一、首先,我们需要编写一个登录拦截器类,将该类实现HandlerInterceptor接口,该接口是spring.web.servlet包下的
LoginInterceptor类
1 public class LoginInterceptor implements HandlerInterceptor { 2 @Override 3 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 4 Object user = request.getSession().getAttribute("user"); 5 if (user == null) { 6 // 没有登录,让用户直接去登录页 7 request.setAttribute("msg", "没有权限,请登录"); 8 request.getRequestDispatcher("/login.html").forward(request, response); 9 return false; 10 } 11 return true; 12 } 13 14 @Override 15 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 16 17 } 18 19 @Override 20 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 21 22 } 23 }
二、然后我们需要在我们的WebMVC配置类中配置拦截器
MyMVCConfig类
1 package com.lzp.config; 2 3 import org.springframework.context.annotation.Configuration; 4 import org.springframework.web.servlet.config.annotation.InterceptorRegistry; 5 import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; 6 import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; 7 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; 8 9 /** 10 * @Author LZP 11 * @Date 2021/4/19 9:39 12 * @Version 1.0 13 * <p> 14 * 自定义扩展MVC类 15 * 如果我们想要扩展功能,就比如说我们要配置一个属于自己的视图解析器类,就可以新建一个类, 16 * 只要将该类实现ViewResolver接口即可,最后再将自己的视图解析器类作为Bean配置到Spring容 17 * 器中(这里我们已经不用配置文件了,现在只要在一个类上加@Configuration注解的类功能就等 18 * 同于之前的配置文件) 19 */ 20 @Configuration 21 public class MyMVCConfig implements WebMvcConfigurer { 22 23 /** 24 * 配置视图控制器 25 * @param registry 26 */ 27 @Override 28 public void addViewControllers(ViewControllerRegistry registry) { 29 registry.addViewController("/").setViewName("login"); 30 registry.addViewController("/login.html").setViewName("login"); 31 registry.addViewController("/main.html").setViewName("main"); 32 } 33 34 /** 35 * 配置拦截器 36 * @param registry 37 */ 38 @Override 39 public void addInterceptors(InterceptorRegistry registry) { 40 // 登录拦截 41 registry.addInterceptor(new LoginInterceptor()) 42 .addPathPatterns("/**") 43 // 注意:不要过滤static目录下的所有,不然可能会有问题 44 .excludePathPatterns("/css/**", "/js/**", "/img/**", "/user/login", "/", "/login.html"); 45 } 46 47 }