SpringBoot中基于拦截器实现登录验证功能
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot中基于拦截器实现登录验证功能相关的知识,希望对你有一定的参考价值。
拦截器简介
拦截器是属于springmvc体系的,只能拦截controller的请求。拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行。
Interceptor 作用
- 日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算 PV(Page View)等; 权限检查:如登录检测,进入处理器检测是否登录;
- 性能监控:通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间。(反向代理,如 Apache 也可以自动记录)
- 通用行为:读取 Cookie 得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取 Locale、Theme 信息等,只要是多个处理器都需要的即可使用拦截器实现。
SpringBoot 提供了 Interceptor 拦截器机制,用于请求的预处理和后处理。在 SpringBoot 中定义一个拦截器有两种方法:第一种是实现 HandlerInterceptor 接口,或者继承实现了 HandlerInterceptor 接口的类(例如:HandlerInterceptorAdapter);第二种方法时实现 Spring 的 WebRequestInterceptor 接口,或者继承实现了 WebRequestInterceptor 接口的类。这些拦截器都是在Handler的执行周期内进行拦截操作的。
示例
第一步:创建拦截器类
创建拦截器类,让其实现handlerIntercepter接口,在其preHandle()方法中作拦截判断,注意该方法返回true表示不拦截继续往下执行,返回false表示拦截不再往下执行
public class LoginHandler implements HandlerInterceptor
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
Object user = request.getSession().getAttribute("user");
if(user == null)
//没有登录
System.out.println("没有登录");
response.sendRedirect(request.getContextPath()+"/user/openLogin");
return false;
else
//已经登录
System.out.println("已经登录");
return true;
HandlerInterceptor中定义了如下三个默认方法:
- preHandle:在Action执行前调用
- postHandle:在Action执行后调用,生成视图前调用
- afterCompletion:在DispatcherServlet完全处理完请求之后被调用,可用于清理资源
第二步:创建配置类
创建配置类,让其实现WebMvcConfigurer接口,在其addInterceptors()方法中对1中创建的拦截器进行配置
@Configuration
public class WegoMvcConfigure implements WebMvcConfigurer
/**
* 拦截器配置
*/
@Override
public void addInterceptors(InterceptorRegistry registry)
//注册Interceptor拦截器
InterceptorRegistration registration = registry.addInterceptor(new LoginHandler());
registration.addPathPatterns("/**"); //所有路径都被拦截
registration.excludePathPatterns( //添加不拦截路径
"/user/openLogin", //登录页面
"/user/login", //登录请求
"/**/*.html", //html静态资源
"/**/*.js", //js静态资源
"/**/*.css" //css静态资源
);
第三步:定义用户登录和退出登录的控制器
@Controller
@RequestMapping("/user")
public class UserController
@Resource
private UserService userService;
/**
* 打开登录页面
*/
@GetMapping("/openLogin")
public String openLogin()
return "frontend/login";
/**
* 登录
*/
@PostMapping("/login")
public String login(String username,String password, HttpSession session)
User user = userService.getUserByUsernameAndPassword(username , password);
if (user == null)
// 登录失败,打开登录页面
return "frontend/login";
else
//登录成功,将用户信息保存到Session中,打开首页
session.setAttribute("user",pageBean.getResult().get(0));
return "redirect:/index";//重定向
/**
* 退出登录
*/
@ResponseBody
@GetMapping("/logout")
String logout(HttpSession session)
session.removeAttribute("user");
return "success";
第四步:测试
- 启动项目,请求首页localhost/wego/index,发现直接打开登录页面
- 在登录页面中登录,成功后进入首页
- 请求localhost/wego/user/logout,退出登录
- 再次请求登录页面发现又会打开登录页面
以上是关于SpringBoot中基于拦截器实现登录验证功能的主要内容,如果未能解决你的问题,请参考以下文章