SpringBoot实现登录拦截器
登录拦截器
在 SpringBoot 开发的项目中,通过实现拦截器来实现用户登录拦截并验证。
所有的用户请求先经过拦截器,由拦截器判断是否放行,再送往Controller
层。
SpringBoot 实现登录拦截的原理
-
SpringBoot 通过实现
HandlerInterceptor
接口实现拦截器,通过实现WebMvcConfigurer
接口实现一个配置类,在配置类中注入拦截器,最后再通过@Configuration
注解注入配置。 -
实现
HandlerInterceptor
接口,可以实现 3 个方法:preHandle
、postHandle
、afterCompletion
。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44public class UserLoginInterceptor implements HandlerInterceptor {
/***
* 在请求处理之前进行调用(Controller方法调用之前)
*/
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("执行了拦截器的preHandle方法");
try {
HttpSession session = request.getSession();
//统一拦截(查询当前session是否存在user)(这里user会在每次登录成功后,写入session)
User user = (User) session.getAttribute(USER_LOGIN_STATE);
if (user != null) {
return true;
}
//重定向登录页面
response.sendRedirect(request.getContextPath() + "/user/login");
} catch (Exception e) {
e.printStackTrace();
}
return false;
//如果设置为false时,被请求时,拦截器执行到此处将不会继续操作
//如果设置为true时,请求将会继续执行后面的操作
}
/***
* 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
*/
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("执行了拦截器的postHandle方法");
}
/***
* 整个请求结束之后被调用,也就是在DispatchServlet渲染了对应的视图之后执行(主要用于进行资源清理工作)
*/
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception {
System.out.println("执行了拦截器的afterCompletion方法");
}
}通过这个拦截器,使得 Controller 在执行之前,都需要执行一遍
preHandle
。 -
实现
WebMvcConfigurer
接口,注册拦截器1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class LoginConfig implements WebMvcConfigurer {
public void addInterceptors(InterceptorRegistry registry) {
//注册TestInterceptor拦截器
InterceptorRegistration registration = registry.addInterceptor(new UserLoginInterceptor());
//所有路径都被拦截
registration.addPathPatterns("/**");
//添加不拦截路径
registration.excludePathPatterns(
"/user/login",
"/user/register",
"/**/*.html",
"/**/*.js",
"/**/*.css"
);
}
}将拦截器注册到了拦截器列表中,并且指明了拦截哪些访问路径,不拦截哪些访问路径,不拦截哪些资源文件;最后再以
@Configuration
注解将配置注入。 -
保持登录状态
在第一次正确登录之后,就将
user
保存到session
中,再次访问页面的时候,登录拦截器就可以找到这个user
对象,就不需要再次拦截到登录界面了。
评论