登录 |  注册
首页 >  编程技术 >  Spring Boot入门基础教程代码实例 >  Spring Boot配置拦截器

Spring Boot配置拦截器

1. 什么是拦截器

拦截器对使用SpringMvc、Struts的开发人员来说特别熟悉,因为你只要想去做好一个项目必然会用到它。拦截器在我们平时的项目中用处有很多,如:日志记录(我们后续章节会讲到)、用户登录状态拦截、安全拦截等等。而SpringBoot内部集成的是SpringMVC控制框架,所以使用起来跟SpringMVC没有区别,只是在配置上有点不同。废话不多说,我们开始我们本章的内容!

在 Spring Boot 项目中,使用拦截器功能通常需要以下 3 步:

  1. 定义拦截器;

  2. 注册拦截器;

  3. 指定拦截规则(如果是拦截所有,静态资源也会被拦截)。

2. 跟踪访问行为

要想实现对访问的拦截,首先要能跟踪访问行为,我们在 Spring Boot 中引入拦截器来实现下。

2.1 使用 Spring Initializr 创建项目

Spring Boot 版本选择 2.2.5 ,Group 为 com.imooc , Artifact 为 spring-boot-interceptor ,生成项目后导入 Eclipse 开发环境。

2.2 引入项目依赖

引入 Web 项目依赖即可。

实例:

		<!-- web项目依赖 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

2.3 创建拦截器

创建的类实现 HandlerInterceptor 接口,即可成为拦截器类.

实例:

/**
 * 自定义拦截器类
 */public class MyInterceptor implements HandlerInterceptor {// 实现HandlerInterceptor接口
	/**
	 * 访问控制器方法前执行
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.println(new Date() + "--preHandle:" + request.getRequestURL());
		return true;
	}

	/**
	 * 访问控制器方法后执行
	 */
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println(new Date() + "--postHandle:" + request.getRequestURL());
	}

	/**
	 * postHandle方法执行完成后执行,一般用于释放资源
	 */
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println(new Date() + "--afterCompletion:" + request.getRequestURL());
	}}

在上面的实例中,我们定义了一个拦截器类 MyInterceptor ,通过实现 HandlerInterceptor 接口,该类具备了拦截器的功能。

MyInterceptor 中的方法执行顺序为 preHandle – Controller 方法 – postHandle – afterCompletion ,所以拦截器实际上可以对 Controller 方法执行前后进行拦截监控。

最后还有一个非常重要的注意点, preHandle 需要返回布尔类型的值。 preHandle 返回 true 时,对控制器方法的请求才能到达控制器,继而到达 postHandle 和 afterCompletion 方法;如果 preHandle 返回 false ,后面的方法都不会执行。

2.4 配置拦截器

上一步我们开发了配置器类,如果想让配置器生效,还需要通过配置类进行相应配置。

实例:

/**
 * Web配置类
 */@Configurationpublic class WebConfig implements WebMvcConfigurer {
	/**
	 * 添加Web项目的拦截器
	 */
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		// 对所有访问路径,都通过MyInterceptor类型的拦截器进行拦截
		registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
	}}

2.5 创建控制器

我们建立一个简单的控制器,实现登录方法,以便检验拦截器的效果。

实例:

/**
* 登录控制器
*/@RestControllerpublic class LoginController {
   @RequestMapping("/login")
   public boolean login(String username, String password) {
   	System.out.println(new Date() + " 某用户尝试登录,用户名:" + username + " 密码:" + password);
   	return true;
   }}

2.6 跟踪访问行为

运行启动类,访问 http://127.0.0.1:8080/login?username=imooc&password=123,控制台输出如下:

图片描述

控制台输出内容

可见我们已经完整的跟踪了一次对 http://127.0.0.1:8080/login 接口的访问。

3. 实现访问控制

区分合法、非法访问,最常见的就是根据用户的登录状态、角色判断。接下来我们就演示下,对未登录用户非法访问请求的拦截。

3.1 修改控制器方法

修改登录方法,当用户输入的用户名和密码正确时,通过 Session 记录登录人信息。

然后开发获取登录人员信息方法,返回 Session 中记录的登录人信息。

实例:

/**
 * 登录控制器
 */@RestControllerpublic class LoginController {
	/**
	 * 登录方法
	 */
	@RequestMapping("/login")
	public boolean login(HttpServletRequest request, String username, String password) {
		if ("imooc".equals(username) && "123".equals(password)) {
			// 登录成功,则添加Session并存储登录用户名
			request.getSession().setAttribute("LOGIN_NAME", username);
			return true;
		}
		return false;
	}

	/**
	 * 获取登录人员信息
	 */
	@RequestMapping("/info")
	public String info(HttpServletRequest request) {
		return "您就是传说中的:" + request.getSession().getAttribute("LOGIN_NAME");
	}}

3.2 修改拦截器方法

由于用户在登录之前还没有设置 Session ,所以登录方法不应该拦截,可以让用户自由请求。但是只有登录成功后的用户,也就是说具备 Session 的用户才能访问 info 方法。

实例:

/**
 * 自定义拦截器类
 */public class MyInterceptor implements HandlerInterceptor {// 实现HandlerInterceptor接口
	/**
	 * 访问控制器方法前执行
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		if (request.getRequestURI().contains("/login") == true) {// 登录方法直接放行
			return true;
		} else {// 其他方法需要先检验是否存在Session
			if (request.getSession().getAttribute("LOGIN_NAME") == null) {//未登录的不允许访问
				return false;
			} else {
				return true;
			}
		}
	}}

3.3 测试

首先直接请求 http://127.0.0.1:8080/info ,由于此时未登录,所以请求被拦截,网页输出如下:

图片描述

访问被拦截

如果先请求登录方法 http://127.0.0.1:8080/login?username=imooc&password=123 ,然后访问 http://127.0.0.1:8080/info ,则网页输出:

图片描述

登录成功后,访问正常通过拦截器
上一篇: Spring Boot Task定时任务
下一篇: Spring Boot实现应用监控与报警
推荐文章
  • 在HTML中,如果你想让一个输入框(input元素)不可编辑,你可以通过设置其readonly属性来实现。示例如下:input type="text" value="此处内容不可编辑" readonly在上述代码中,readonly属性使得用户无法修改输入框中的内容。另外,如果你希望输入框完全不可交
  • ASP.NET教程ASP.NET又称为ASP+,基于.NETFramework的Web开发平台,是微软公司推出的新一代脚本语言。ASP.NET是一个使用HTML、CSS、JavaScript和服务器脚本创建网页和网站的开发框架。ASP.NET支持三种不一样的开发模式:WebPages(Web页面)、
  • C# 判断判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。下面是大多数编程语言中典型的判断结构的通常形式:判断语句C#提供了以下类型的判断语句。点击链接查看每个语句的细节。语句描述if语句一个 if语句 由一个布尔表达式后跟
  • C#循环有的时候,可能需要多次执行同一块代码。通常情况下,语句是顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推。编程语言提供了允许更为复杂的执行路径的多种控制结构。循环语句允许我们多次执行一个语句或语句组,下面是大多数编程语言中循环语句的通常形式:循环类型C#提供了以下几种循环类型
  • C#数组(Array)数组是一个存储相同类型元素的固定大小的顺序集合。数组是用来存储数据的集合,一般认为数组是一个同一类型变量的集合。声明数组变量并不是声明number0、number1、...、number99一个个单独的变量,而是声明一个就像numbers这样的变量,然后使用numbers[0]
  • ASP.NET是一个由微软公司开发的用于构建Web应用程序的框架,它是.NETFramework的一部分。它提供了一种模型-视图-控制器(MVC)架构、Web表单以及最新的ASP.NETCore中的RazorPages等多种开发模式,可以用来创建动态网页和Web服务。以下是一些基础的ASP.NET编
学习大纲