文档章节

Spring Boot 中如何使用拦截器(十五)

老虎是个蛋蛋
 老虎是个蛋蛋
发布于 2018/07/25 15:19
字数 897
阅读 1454
收藏 30

关于拦截器,大家一定都不陌生,spring boot 中是如何使用拦截器的呢?今天就举个例子,来给大家说明一下,废话不多说,开始撸代码!!!

1、创建一个新的spring boot项目,并引入相应的jar,pom文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.quick</groupId>
	<artifactId>quick-intercprot</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>quick-intercprot</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.3.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

2、编写HandlerInterceptor

public class TestInterceptor extends HandlerInterceptorAdapter{
	private static final String username="wang";
	private static final String pwd="123";
	@Override
	public boolean preHandle(HttpServletRequest request,
							 HttpServletResponse response, Object handler) throws Exception {
		System.out.println("preHandle start...");
		String usernameParam = request.getParameter("username");
		String pwdParam = request.getParameter("pwd");
		if(!StringUtils.isEmpty(usernameParam)&&!StringUtils.isEmpty(pwdParam)){
			if(username.equals(usernameParam)&&pwdParam.equals(pwd)){
				System.out.println("TRUE");
				return Boolean.TRUE;
			}else {
				System.out.println("FALSE");
				response.sendRedirect(request.getContextPath()+"/index/errorIndex");
				return Boolean.FALSE;
			}
		}else {
			return Boolean.TRUE;
		}
	}
}

我们创建一个名为TestInterceptor 的拦截器并继承HandlerInterceptorAdapter ,实现HandlerInterceptorAdapter抽象类中的preHandle方法。此处我们模拟一个登陆请求的拦截,当账号密码正确时拦截器返回true并跳转到相应的页面,如果账号密码错误,重定向到一个错误页面。

3、编写拦截器配置

@Configuration
public class InterceptorConfig extends WebMvcConfigurationSupport {
	@Override
	protected void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(new TestInterceptor()).addPathPatterns("/test/**");
		super.addInterceptors(registry);
	}
}

由于我使用的springboot是2.0.3.RELEASE,2.0以后的版本需要继承WebMvcConfigurationSupport ,如果你使用的是2.0以下的版本请继承WebMvcConfigurerAdapter ,此处做了一个请求的拦截,只有/test/**的请求才会被拦截到。

4、编写测试Controller,此处我们需要写三个Controller

此方法为模拟的登陆请求的方法

@RestController
@RequestMapping("/test")
public class TestController {
	@RequestMapping("/t")
	public String test(String username,String pwd){
		return "success";
	}
}

此方法主要是为了模拟拦截器是否能够拦截特定的请求路径,故将请求写为/test2/**

@RestController
@RequestMapping("/test2")
public class Test2Controller {
	@RequestMapping("/t")
	public String test(String param){
		return "success";
	}
}

此方法主要是为了当账号密码错误时跳转错误页面

@Controller
@RequestMapping("/index")
public class IndexController {
	@RequestMapping("/errorIndex")
	public String index(){
		return "errorIndex";
	}
}

5、编写错误页面errorIndex.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>login error,账号或者密码错误</h1>
</body>
</html>

6、启动项目,测试拦截器是否起效

首先我们访问http://localhost:8080/test/t?username=wang&pwd=123 路径,如果现实一下页面,则表示账号密码正确,登陆成功

然后我们将pwd修改为1234,http://localhost:8080/test/t?username=wang&pwd=1234 ,页面显示如下:

因为密码错误,请求跳转到了错误页面

密码拦截器生效,下面我们测试一下固定请求拦截是否生效,我们请求一下路径http://localhost:8080/test2/t?param=123 效果如下图:

ok拦截器没有拦截/test2/**的请求,实验成功

我们来总结一下

  1. 编写HandlerInterceptor继承HandlerInterceptorAdapter实现preHandle方法
  2. 编写拦截器配置继承WebMvcConfigurationSupport实现addInterceptors方法

源码地址 https://gitee.com/wangGet/spring-boot-quick/tree/master/quick-intercprot

© 著作权归作者所有

老虎是个蛋蛋
粉丝 173
博文 31
码字总数 40085
作品 0
朝阳
高级程序员
私信 提问
spring boot 1.5.4 整合redis、拦截器、过滤器、监听器、静态资源配置(十六)

上一篇:spring boot 1.5.4 整合webService(十五) 1 Spring Boot整合redis和缓存 Spring Boot中除了对常用的关系型数据库提供了优秀的自动化支持之外,对于很多NoSQL数据库一样提供了自动化...

wyait
2017/10/10
0
0
恒宇少年/spring-boot-chapter

简书整套文档以及源码解析 专题 专题名称 专题描述 001 Spring Boot 核心技术 讲解SpringBoot一些企业级层面的核心组件 002 Spring Cloud 核心技术 对Spring Cloud核心技术全面讲解 003 Quer...

恒宇少年
2018/04/19
0
0
spring boot框架学习8-【干货】spring boot的web开发(4)-自定义拦截器处理权限

本章节主要内容: 通过前面的学习,我们了解并快速完成了spring boot第一个应用。spring boot企业级框架,那么spring boot怎么读取静态资源?如js文件夹,css文件以及png/jpg图片呢?怎么自定...

中凯_凯哥java
2017/11/11
118
0
spring boot 1.5.4 入门和原理(二)

1 spring boot入门 1.1 环境准备 JDK 7及以上 eclipse开发工具 项目管理工具Maven 本文采用、RELEASE(或1.5.2.RELEASE)调试通过。 spring-boot相关项目源码, 码云地址:https://git.oschi...

wyait
2017/09/18
0
0
如何伪装成一个服务端开发(七)

目录 如何伪装成一个服务端开发(一) 如何伪装成一个服务端开发(二) 如何伪装成一个服务端开发(三) 如何伪装成一个服务端开发(四) 如何伪装成一个服务端开发(五) 如何伪装成一个服务端开发(六...

街角的小丑
01/04
37
0

没有更多内容

加载失败,请刷新页面

加载更多

Less导入选项

Less 提供了CSS @import CSS规则的几个扩展,以提供更多的灵活性来处理外部文件。 语法: @import (keyword) "filename"; 以下是导入指令的相关详情: reference,使用较少的文件但不输出。 ...

凌兮洛
8分钟前
5
0
Docker下实现MySQL主从(读、写分离)同步配置

docker下实现两个(或多个)mysql容器的主、从数据库同步配置,首先要明白docker容器的相互通信关系,默认是使用的bridge模式: 也就是说,通过docker run命令创建docker容器是每个容器都有自己...

源哥L
18分钟前
10
0
一起来学Java8(三)——方法引用

在一起来学Java8(一)——函数式编程中有一个简单的函数式编程的例子: import java.util.function.Consumer;class Person { public static void sayHello(String name) { S...

猿敲月下码
37分钟前
15
0
读书笔记:深入理解ES6(十一)

第十一章 Promise与异步编程   Promise可以实现其他语言中类似Future和Deferred一样的功能,是另一种异步编程的选择,它既可以像事件和回调函数一样指定稍后执行的代码,也可以明确指示代码...

张森ZS
今天
23
0
面试官,Java8 JVM内存结构变了,永久代到元空间

在文章《JVM之内存结构详解》中我们描述了Java7以前的JVM内存结构,但在Java8和以后版本中JVM的内存结构慢慢发生了变化。作为面试官如果你还不知道,那么面试过程中是不是有些露怯?作为面试...

程序新视界
今天
31
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部