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         &nbsp;
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 }

三、测试

posted @ 2021-04-24 10:58  没有你哪有我  阅读(657)  评论(0编辑  收藏  举报