news 2026/5/26 3:57:48

第十一章篇 实现拦截器

作者头像

张小明

前端开发工程师

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/5/25 14:57:06

从零构建智能Agent编排系统,掌握Docker Swarm与K8s协同秘技

第一章&#xff1a;智能 Agent 的 Docker 容器编排策略在构建分布式智能 Agent 系统时&#xff0c;Docker 容器化技术为服务的隔离性、可移植性和弹性伸缩提供了坚实基础。然而&#xff0c;随着 Agent 数量增长和交互复杂度上升&#xff0c;单一容器部署已无法满足需求&#xf…

作者头像 李华
网站建设 2026/5/25 15:17:17

Docker Buildx构建缓慢?你必须知道的7个Agent镜像优化实践

第一章&#xff1a;Docker Buildx构建缓慢的根源分析在使用 Docker Buildx 进行多平台镜像构建时&#xff0c;开发者常遇到构建速度显著下降的问题。该现象并非由单一因素导致&#xff0c;而是多种底层机制共同作用的结果。资源分配不足 Buildx 构建依赖于 BuildKit 引擎&#…

作者头像 李华
网站建设 2026/5/25 5:41:27

从安装到运行:VSCode量子项目部署全流程(附官方插件清单)

第一章&#xff1a;VSCode 的量子开发环境搭建 在当前量子计算快速发展的背景下&#xff0c;使用现代化编辑器进行高效开发变得尤为重要。Visual Studio Code&#xff08;VSCode&#xff09;凭借其强大的扩展生态和轻量级架构&#xff0c;成为搭建量子开发环境的理想选择。通过…

作者头像 李华
网站建设 2026/5/25 22:46:24

Arduino UNO Q 从 Arduino Cloud 远程控制闪烁 LED

本示例面向对物联网与 Arduino 生态感兴趣的初学者与进阶者&#xff0c;一步一步实现“Blinking LED from Arduino Cloud”示例的原理与操作方案。我们将通过Arduino Cloud 网页端的仪表盘创建一个开关&#xff0c;远程控制Arduino UNO Q 板上自带的LED。要实现这一点&#xff…

作者头像 李华
网站建设 2026/5/26 4:49:16

8 个自考论文降重工具,AI 免费网站推荐

8 个自考论文降重工具&#xff0c;AI 免费网站推荐 论文写作的“重担”与“焦虑” 对于自考学生而言&#xff0c;撰写一篇高质量的论文不仅是对知识的综合检验&#xff0c;更是对时间、精力和耐心的极限挑战。从选题到开题&#xff0c;从资料收集到文献综述&#xff0c;再到最终…

作者头像 李华
网站建设 2026/5/24 20:50:35

离网下基于下垂控制的 T 型三电平逆变器研究

离网下三相不平衡负载&#xff0c;基于下垂控制的T型三电平逆变器&#xff0c;采用正负序分离四环控制&#xff0c;正序电压电流双闭环&#xff0c;负序电压电流双闭环&#xff0c;中点电位平衡控制&#xff0c;采用SPWM调制。 1.提供下垂控制原理,参数计算方法以及相关文献 2.…

作者头像 李华