当前位置: 首页 > news >正文

SpringMVC 拦截器(Interceptor)

一.拦截器

假设有这么一个场景,一个系统需要用户登录才能进入,在检验完用户的信息后对页面进行了跳转。但是如果我们直接输入跳转的url,可以绕过用户信息校验(用户登录),直接进入系统。

因此我们引入了使用session检验,我们在用户登录的时候创建session,并将这个用户的信息存入session中(setAttribute),这样我们跳转其他的url时就可以对session进行检验。

HttpSession httpSession=httpServletRequest.getSession(false);
if(httpSession==null){System.out.println("没有创建会话");return new User();
}
User user=(User) httpSession.getAttribute("user");
if(user==null){System.out.println("没有该用户");return new User();
}

但是这种方法每写一个接口就要重复一遍,有没有什么办法能不写这些重复的内容。这就是拦截器的内容了。

拦截器属于SpringMVC框架,是 Spring 生态的核心组件之一。拦截器主要用来拦截用户请求,在指定方法前后执行业务代码。总的来说,拦截器是 Spring 送给 Web 开发者的 “定制化关卡”,只在 Spring 的世界里生效。

使用拦截器的方法:

1)定义拦截器;2)注册配置拦截器。

二.实现流程

1.定义拦截器

自定义一个拦截器,实现 HandlerInterceptor 接口,并重写其方法。

1)preHandle()方法:在目标方法执行前执行,返回true继续执行后续操作,返回false拦截后续操作;

2)postHandle()方法:在目标方法执行后执行,无返回值

3)afterCompletion()方法:视图渲染完毕后执行。

我们可以将我们的业务逻辑写在这些方法中。比如上面的例子,我们的目的就是为了拦截用户在没有登录的时候就访问系统内部的url,所以我们可以写一个拦截器:

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {HttpSession session=request.getSession(false);if(!checkUser(session)){response.setContentType("text/html;charset=utf-8");response.setStatus(401);String msg="用户未登录哦";response.getOutputStream().write(msg.getBytes("UTF-8"));return false;}return true;
}
private boolean checkUser(HttpSession session){if(session==null){log.warn("用户未登录,session==null");return false;}UserInfo userInfo=(UserInfo)session.getAttribute("userInfo");if(userInfo==null){log.warn("用户未登录,userInfo==null");return false;}log.info("用户已登录");return true;
}

最后不要忘记将我们定义实现 HandlerInterceptor 接口的类注入到Spring容器中。

这样我们的拦截器就定义完了。

2.注册配置拦截器

我们要实现 WebMvcConfigurer 接口,并重写其中 addInterceptors 方法。

 举例实现:

@Configuration
public class WebConfig implements WebMvcConfigurer {@ResourceLoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor).addPathPatterns("/**");}
}

我们通过addPathPatterns来指定要拦截的路径,也可以使用excludePathPatterns来指定不要拦截的路径。像上面的代码,我们一次性拦截了所有请求,用户登录请求也被拦截了,这是不行的。因此我们可以改一下上面的代码,使用excludePathPatterns来指定用户登录的请求不要拦截。

@Configuration
public class WebConfig implements WebMvcConfigurer {@ResourceLoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/uer/login");}
}

下面是一些常见的拦截配置:

拦截路径含义举例
/*拦截一级路径能拦截 /user,/login,不能拦截 /user/login
/**拦截任意路径拦截所有
/user/*拦截/user的下一级路径能拦截 /user/getList,不能拦截 /user/getList/1 和 /user
/user/**拦截/user下的所有路径拦截/user下的所有路径,但是不能拦截 /book/getList

此外拦截器不仅可以拦截项目中的URL,还可以拦截静态资源(html,图片等)。


http://www.mrgr.cn/news/96312.html

相关文章:

  • SpringCloud+Mybatis-Plus+Docker+RabbitMQ+Redis+Elasticsearch黑马商城
  • 大模型微调环境配置
  • Gateway实战(二)、负载均衡
  • 【云服务器】在 Linux(Ubuntu / CentOS 7)上快速搭建我的世界 Minecraft 服务器,并实现远程联机,详细教程
  • Nginx 优化
  • Java基础 3.28
  • C++指针(五)完结篇
  • 刘火良FreeRTOS内核实现与应用学习之6——多优先级
  • 从泛读到精读:合合信息文档解析如何让大模型更懂复杂文档
  • 数据结构与算法:1,选择排序
  • 菜鸡前端计算机强基计划之CS50 第七课 python 入门—— Python 中文件操作专题学习
  • 基于SpringBoot的“交通旅游订票系统”的设计与实现(源码+数据库+文档+PPT)
  • linux》》docker 、containerd 保存镜像、打包tar、加载tar镜像
  • 5.0 WPF的基础介绍1-Grid,Stack,button
  • flink 分组窗口聚合 与 窗口表值函数聚合 的区别
  • Codeforces Round 1013 (Div. 3)-F
  • 06-SpringBoot3入门-常见注解(简介)
  • 典范硬币系统(Canonical Coin System)→ 贪心算法
  • 【商城实战(93)】商城高并发实战:分布式锁与事务处理深度剖析
  • 如何一键安装所有Python项目的依赖!