SpringBoot中如何基于拦截器实现登录验证呢?
下文笔者讲述SpringBoot中使用拦截器实现登录验证的方法及示例分享,如下所示
拦截器简介
拦截器在SpringMVC中用于拦截controller请求 是一种方法的动态拦截技术 如: Interceptor ================================================================== SpringBoot提供Interceptor拦截器机制 用于请求预处理和后处理 SpringBoot中定义一个拦截器有两种方法 第一种是实现 HandlerInterceptor 接口 或继承实现HandlerInterceptor 接口的类(如:HandlerInterceptorAdapter) 第二种方法时实现Spring中的WebRequestInterceptor接口或继承实现了WebRequestInterceptor接口类
Interceptor(拦截器)的使用场景
日志记录: 记录请求信息的日志 方便进行信息监控、信息统计、计算 PV(Page View)等; 权限检查: 如登录检测,进入处理器检测是否登录; 性能监控: 通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间。(反向代理,如 Apache 也可以自动记录) 通用行为: 读取Cookie得到用户信息并将用户对象放入请求 从而方便后续流程使用 还有如提取 Locale、Theme信息等 只要是多个处理器都需要的即可使用拦截器实现。例
第一步:创建拦截器类 创建拦截器类 让其实现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 java265MvcConfigure 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/java265/index,发现直接打开登录页面 在登录页面中登录,成功后进入首页 请求localhost/java265/user/logout,退出登录 再次请求登录页面发现又会打开登录页面
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。