news 2026/8/6 5:02:05

第十一章篇 实现拦截器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第十一章篇 实现拦截器

SpringMVC中拦截器用于对处理器(controller)进行预处理和后处理。

拦截器需要实现Interceptor接口,接口有是哪个方法,分别为:

preHandle: 客户端发送请求,在处理器执行请求之前执行preHandle方法中逻辑,当该方法返回true则执行下个拦截器(如果有),或者处理器

postHandle: 当处理器执行完之后,视图渲染之后执行该方法 。 后置处理,对ModelAndView进行修改

afterCompletion: 在整个请求结束(视图渲染之后)执行。对资源进行关闭,记录日志

代码实现
创建拦截器类实现HandlerInterceptor接口
/** * 自定义拦截器类 */ @Component public class MyInterceptor implements HandlerInterceptor { /** * 在视图渲染之后执行的方法 */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("---------afterCompletion--------"); } /** * 表示 请求 执行处理器方法之前,先执行拦截器中prehandle方法中的逻辑 * @param request 请求对象 * @param response 响应对象 * @return boolean 如果指定该方法逻辑之后返回true,则执行下一个拦截器(如果有),如果没有就执行处理器 。返回false表示拦截当前请求 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("--------preHandle------------"); return false; //放行 } /** * 在执行处理器之后,渲染视图之前执行 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("---------postHandle--------"); } }
创建配置类,设置拦截器拦截处理器
/** * 自定义配置类 * 配置拦截器 */ @Configuration public class MyConfiguration implements WebMvcConfigurer { @Autowired private MyInterceptor myInterceptor; /** * 重写添加拦截器方法 * @param registry */ @Override public void addInterceptors(InterceptorRegistry registry) { //添加拦截器 registry.addInterceptor(myInterceptor) //设置拦截器目标(处理器) // .addPathPatterns("/user/login","/params") //拦截部分url信息 .addPathPatterns("/**") //拦截所有处理器(Controller),注意包括静态资源 .excludePathPatterns("/userDetail.html"); //表示用户访问login页面时不会被拦截器 } }
登录方法
@RestController public class LoginController { /** * 用户登录方法 */ @RequestMapping("login") public ResultObj login(String username,String password){ //判断用户名和密码是否正确 if(username.equals("root") && password.equals("234")){ return ResultObj.ok(username); }else { //表示用户名或密码错误, 抛出异常对象 throw new UserNameAndPWDErrorException("用户名或密码错误"); } } }

练习

通过拦截器实现用户认证操作

有登录页面、和登录接口 可以在用户不用登录即可访问

定义用户管理CRUD操作,这些操作需要用户认证之后方可访问

定义拦截器实现访问拦截器,判断用户是否登录,如果登录则可以访问 用户管理中CRUD接口,否则不能访问

思路:使用拦截器将所有资源拦截,放行登录页面和登录的接口,登录成功后设置一个session保存一个身份令牌用于让拦截器进行放行,在拦截器中进行编写代码:凡是没有session身份令牌的访问一律拦截

代码实现

创建登录页面

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登录页面</title> </head> <body> <!-- 用户登录表单--> <form action="/user/login" method="post"> <div> <input type="text" name="uname" placeholder="请输入用户名称" /> </div> <div> <input type="password" name="pwd" placeholder="请输入用户密码" /> </div> <div> <input type="submit" value="登录账号" /> <input type="reset" /> </div> </form> </body> </html>

UserController类

@RestController public class UserController { /** * 用户登录 接口方法 */ @RequestMapping("/user/login") public ResultObj login(@RequestParam String uname, @RequestParam String pwd, HttpSession session){ //1.判断用户名和密码是否正确 if(uname.equals("ykj") && pwd.equals("333")){ //表示用户登录成功 //保存用户信息到session对象 session.setAttribute("uname", uname); //响应成功信息给前端 return ResultObj.ok(uname); }else { //表示登录失败 throw new UserNameAndPWDErrorException("你输入用户名和密码错误"); } } /** * 查询所有用户信息 */ @RequestMapping("/selectAll") public ResultObj selectAll(){ return ResultObj.ok().msg("查询所有用户成功!"); } /** * 新增方法 */ @RequestMapping("/addUser") public ResultObj addUser(){ return ResultObj.ok().msg("新增用户成功"); } /** * 删除方法 */ @RequestMapping("/delById") public ResultObj delById(Integer uid){ return ResultObj.ok().msg("删除用户成功"); } }

创建用户认证拦截器

/** * 自定义用户认证 拦截器 */ @Component public class CheckIsLoginHandlerIntercptor implements HandlerInterceptor { ​ /** * 用户在方法指定方法之前执行执行逻辑代码 * 判断用户是否登录 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //1.获取sesssion对象 HttpSession session = request.getSession(); //2.获取用户名 String uname = (String) session.getAttribute("uname"); //3.判断uname是否有值 if(uname != null && !uname.trim().isEmpty()){ //表示用户一登录 return true;//放行 } //重定向到登录页面 response.sendRedirect("/loginPage.html"); return false;//拦截器 } }
修改配置类,并配置拦截器
/** * 自定义配置类 * 配置拦截器 */ @Configuration public class MyConfiguration implements WebMvcConfigurer { ​ @Autowired private MyInterceptor myInterceptor; @Autowired private CheckIsLoginHandlerIntercptor checkIsLoginHandlerIntercptor; /** * 重写添加拦截器方法 * @param registry */ @Override public void addInterceptors(InterceptorRegistry registry) { //添加拦截器 registry.addInterceptor(checkIsLoginHandlerIntercptor) //设置拦截器目标(处理器) // .addPathPatterns("/user/login","/params") //拦截部分url信息 .addPathPatterns("/**") //拦截所有处理器(Controller),注意包括静态资源 .excludePathPatterns("/loginPage.html","/user/login"); //表示用户访问login页面时不会被拦截器 } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/6 5:01:34

错过再等一年!Dify最新支持的10种闭源模型适配清单泄露

第一章&#xff1a;Dify私有化部署的模型适配概述 在企业级AI应用中&#xff0c;Dify的私有化部署支持将大语言模型&#xff08;LLM&#xff09;深度集成至内部系统&#xff0c;实现数据安全与业务闭环。模型适配是私有化部署的核心环节&#xff0c;涉及模型格式兼容、接口协议…

作者头像 李华
网站建设 2026/8/6 2:03:06

Java 字节码工具 ASM,实现类的动态增强

一、什么是 ASM&#xff1f; ASM 是一个轻量级、高性能的 Java 字节码操控框架&#xff0c;它基于字节码指令集操作&#xff0c;能够直接读取、修改和生成 Java 字节码文件&#xff08;.class文件&#xff09;&#xff0c;是 Java 字节码操作领域的核心工具之一。常见的开源框架…

作者头像 李华
网站建设 2026/8/6 2:09:29

HCNP学习第五天打卡

RIP定义&#xff1a;最经典的距离矢量路由协议。面向对象&#xff1a;IPV4------RIPV1&RIPV2IPV6------RIPV2更新与接受&#xff1a;周期性发送本地设备路由表&#xff0c;其他设备进行接受对比后&#xff0c;实现实时适配网络中的拓扑更新。路由更新步骤&#xff1a;路由器…

作者头像 李华
网站建设 2026/8/6 20:00:46

担心音质受损?教你无损音频格式转换怎么操作

在日常工作、剪辑视频或是享受音乐时&#xff0c;我们经常会遭遇这样的尴尬&#xff1a;下载的高品质素材导入剪辑软件显示“格式错误”&#xff0c;或者从录音笔导出的文件在手机上无法播放。这种令人头疼的状况&#xff0c;通常是因为音频格式不兼容造成的。不同的设备和软件…

作者头像 李华