【精品】SpringBoot中基于拦截器实现登录验证功能

news/2024/11/28 11:44:33/

拦截器简介

拦截器是属于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 {@Overridepublic 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 {/*** 拦截器配置*/@Overridepublic 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 {@Resourceprivate 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";}
}

第四步:测试

  1. 启动项目,请求首页localhost/wego/index,发现直接打开登录页面
  2. 在登录页面中登录,成功后进入首页
  3. 请求localhost/wego/user/logout,退出登录
  4. 再次请求登录页面发现又会打开登录页面

http://www.ppmy.cn/news/30431.html

相关文章

浏览器主页被hao123劫持的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…

基于jdk8的HashMap源码解析

hashMap常见面试题总览 为什么重写Equals还要重写HashCode方法?HashMap如何避免内存泄漏问题?HashMap1.7底层是如何实现的?HashMapKey为null存放在什么位置?HashMap如何解决Hash冲突问题?HashMap底层采用单链表还是双…

Java知识复习(十三)数据库和SQL

1、主键和外键 主键也叫主码。主键用于唯一标识一个元组,不能有重复,不允许为空。一个表只能有一个主键。外键也叫外码。外键用来和其他表建立联系用,外键是另一表的主键,外键是可以有重复的,可以是空值。一个表可以有…

Arduino添加ESP32开发板

【2023年3月4日】 最近要在新电脑上安装Arduino,需要进行一些配置,正好记录一下! Arduino2.0.1 下的开发板添加操作。 ESP32开发板GitHub链接: GitHub - espressif/arduino-esp32: Arduino core for the ESP32Arduino core for…

Linux 进程:exec函数簇

目录(1)execl(2)execlp(3)execle(4)execv(5)execvp(6)execve在进程控制中提到,子进程的最大价值在于程序替换,…

炫云渲染质量功能测试

炫云已经支持优化渲染质量,分别是保守优化、中度优化和深度优化,使用后效果图的渲染时间会有所缩短,尤其对低版本V-Ray和参数设置不当的场景非常有效,能大幅提升渲染速度及节省渲染费用,当然最终效果图有可能有稍许差异…

TypeScript篇.01-简介,类,接口,基础类型

1.简介(1)安装及编译安装: npm install -g typescript创建 .ts 后缀名的文件编译: tsc 文件名.ts 编译后会生成同名 .js 的文件查看: 在html文件中script引入js文件,运行查看控制台即可(2)类型注解TypeScript里的类型注解是一种轻量级的为函数或变量添加约束的方式 变量或函数声…

RTOS中相对延时和绝对延时的区别

相信许多朋友都有过这么一个需求:固定一个时间(周期)去处理某一件事情。 比如:固定间隔10ms去采集传感器的数据,然后通过一种算法计算出一个结果,最后通过指令发送出去。 你会通过什么方式解决呢&#xf…