Spring boot 集成三种拦截方式
三种拦截方式分别为:
javax.servlet.Filter
org.springframework.web.servlet.HandlerInterceptor
org.aspectj.lang.annotation.Aspect
拦截先后顺序
客户端请求 --》 Filter --》 HandlerInterceptor --》 Aspect --》 目标方法 --》 Aspect --》 HandlerInterceptor --》 Filter --》 客户端
示例如下:
1. 新建Maven项目 interceptor
2. pom.xml
<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.java</groupId>
<artifactId>interceptor</artifactId>
<version>1.0.0</version> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent> <dependencies> <!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency> <!-- 热部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency> </dependencies> <build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin> <plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
3. InterceptorStarter.java
package com.java; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
public class InterceptorStarter { public static void main(String[] args) {
SpringApplication.run(InterceptorStarter.class, args);
} }
4. DemoController.java
package com.java.controller; import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.Map; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
@RequestMapping("/demo")
public class DemoController { @GetMapping("/getHostMessage")
public Map<String, Object> getHostMessage(String type, String age) {
Map<String, Object> map = new HashMap<>(); System.out.println();
System.out.println("type: " + type);
System.out.println(); // 测试异常情况
if ("exception".equals(type)) {
throw new RuntimeException("异常演习!");
}
try {
InetAddress serverHost = InetAddress.getLocalHost();
map.put("hostName", serverHost.getHostName());
map.put("hostAddress", serverHost.getHostAddress());
map.put("type", type);
map.put("age", age);
} catch (UnknownHostException e) {
e.printStackTrace();
} return map;
} }
5. DemoFilter.java
package com.java.interceptor; import java.io.IOException; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Component; /**
* <blockquote>
*
* <pre>
* 请求拦截过滤器
*
* 1. 开启 @Component 注解便可启用拦截功能
* 2. 不开启 @Component 可通过FilterRegistrationBean 设置注册到 @Configuration 注解的配置类中
*
* </pre>
*
* </blockquote>
*
*/
//@Component // 不开启注解时可以通过配置启动
public class DemoFilter implements Filter { @Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化DemoFilter");
} @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
System.out.println(String.format("[ DemoFilter ] [ Into %s ]", req.getRequestURI())); chain.doFilter(request, response); System.out.println(String.format("[ DemoFilter ] [ Exit %s ]", req.getRequestURI()));
} @Override
public void destroy() {
System.out.println("销毁DemoFilter");
} }
6. DemoInterceptor.java
package com.java.interceptor; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; @Component
public class DemoInterceptor implements HandlerInterceptor { @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println(String.format("\n[ DemoInterceptor ] [ Into %s ]", request.getRequestURI()));
System.out.println("[ preHandle ]"); System.out.println(((HandlerMethod) handler).getBeanType().getName());
System.out.println(((HandlerMethod) handler).getMethod().getName()); return true;
} @Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("[ postHandle ] 抛出异常时不执行");
} @Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e) throws Exception {
System.out.println("[ afterCompletion ]");
System.out.println("Exception is " + e); // 抛出异常时Content-Type为 text/html;charset=ISO-8859-1
if (null != e) {
response.setContentType("text/html;charset=UTF-8");
} System.out.println(String.format("[ DemoInterceptor ] [ Exit %s ]\n", request.getRequestURI()));
} }
7. DemoAspect.java
package com.java.interceptor; import java.util.Arrays; import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component; @Aspect
@Component
public class DemoAspect { @Around("execution(* com.java.controller..*.*(..))")
public Object around(ProceedingJoinPoint point) throws Throwable {
System.out.println(String.format("\n[ DemoAspect ] [ Into %s ]", point.getSignature())); System.out.println(Arrays.toString(point.getArgs()));
Object object = point.proceed(); System.out.println(String.format("[ DemoAspect ] [ Exit %s ]\n", point.getSignature()));
return object;
} @AfterThrowing(pointcut = "execution(* com.java.controller..*.*(..))", throwing = "e")
public void afterThrowing(Throwable e) {
System.out.println(String.format("[ DemoAspect ] %s\n", e));
} }
8. WebConfig.java
package com.java.config; import javax.servlet.Filter; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import com.java.interceptor.DemoFilter;
import com.java.interceptor.DemoInterceptor; @Configuration
public class WebConfig implements WebMvcConfigurer { @Autowired
private DemoInterceptor demoInterceptor; @Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(demoInterceptor);
} @Bean
public FilterRegistrationBean<Filter> demoFilter() { FilterRegistrationBean<Filter> registrationBean = new FilterRegistrationBean<>(); DemoFilter demoFilter = new DemoFilter();
registrationBean.setFilter(demoFilter);
registrationBean.addUrlPatterns("/*"); return registrationBean; } }
9. 运行InterceptorStarter.java, 启动测试
浏览器输入 http://localhost:8080/demo/getHostMessage?age=16&type=normal
返回结果如下:
{"hostName":"Logan","hostAddress":"192.168.1.101","type":"normal","age":"16"}
查看控制台打印信息如下:
[ DemoFilter ] [ Into /demo/getHostMessage ] [ DemoInterceptor ] [ Into /demo/getHostMessage ]
[ preHandle ]
com.java.controller.DemoController
getHostMessage [ DemoAspect ] [ Into Map com.java.controller.DemoController.getHostMessage(String,String) ]
[normal, 16] type: normal [ DemoAspect ] [ Exit Map com.java.controller.DemoController.getHostMessage(String,String) ] [ postHandle ] 抛出异常时不执行
[ afterCompletion ]
Exception is null
[ DemoInterceptor ] [ Exit /demo/getHostMessage ] [ DemoFilter ] [ Exit /demo/getHostMessage ]
异常场景测试,浏览器输入http://localhost:8080/demo/getHostMessage?age=16&type=exception
返回结果自行研究。
三种拦截功能拦截顺序为:
客户端请求 --》 Filter --》 HandlerInterceptor --》 Aspect --》 目标方法 --》 Aspect --》 HandlerInterceptor --》 Filter --》 客户端
.
Spring boot 集成三种拦截方式的更多相关文章
- Spring boot 集成三种定时任务方式
三种定时任务方式分别为 org.springframework.scheduling.annotation.Scheduled java.util.concurrent.ScheduledExecut ...
- Spring Boot实践——三种拦截器的创建
引用:https://blog.csdn.net/hongxingxiaonan/article/details/48090075 Spring中的拦截器 在web开发中,拦截器是经常用到的功能.它可 ...
- spring Bean的三种配置方式
Spring Bean有三种配置方式: 传统的XML配置方式 基于注解的配置 基于类的Java Config 添加spring的maven repository <dependency> ...
- Spring Boot 项目几种启动方式
Spring Boot 项目几种启动方式 1. 使用 main 启动 jar xxxx.jar 2. 使用 mvn 启动 mvn spring-boot:run 3. 使用 Spring Boot c ...
- Spring IOC以及三种注入方式
IOC是spring的最基础部分,也是核心模块,Spring的其他组件模块和应用开发都是以它为基础的.IOC把spring的面向接口编程和松耦合的思想体现的淋漓尽致. IOC概念 IOC(Invers ...
- Spring IOC 中三种注入方式
项目错误知识点记录 正文 最近在项目的时候,用到Spring框架,Spring框架提供了一种IOC的自动注入功能,可以很轻松的帮助我们创建一个Bean,这样就省的我们四处写new Object()这样 ...
- Spring:Spring-IOC三种注入方式、注入不同数据类型
一.Spring IOC(依赖注入的三种方式): 1.Setter方法注入 package com.jpeony.spring.setter; import com.jpeony.spring.com ...
- Spring常用的三种注入方式
好文要收藏,摘自:https://blog.csdn.net/a909301740/article/details/78379720 Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入 ...
- spring Bean的三种注入方式
1.构造函数注入: 构造函数的注入方式分为很多种 (1)普通构造函数,空参数的构造函数 <bean id="exampleBean" class="examples ...
随机推荐
- 在Mac上配置iTerm2+Oh-My-Zsh&配置主题
本教程基本完全按照iTerm2 + Oh My Zsh 打造舒适终端体验配置 但是个人感觉博主的颜色搭配不合理,体现在补全命令的字体不清晰,提示命令与背景颜色太过相近 所以,再此之后使用了Bullet ...
- java替换word
package demo; import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOExcept ...
- [转]javascript实现限制上传文件的大小
本文转自:http://www.micmiu.com/lang/javascript/js-check-filesize/ 目录 基本思路 示例 [一].基本思路 在FireFox.Chrome浏览器 ...
- java多线程之原子变量
看链接博客:http://blog.csdn.net/u011116672/article/details/51068828
- Windows 2008 R2 防火墙允许Serv-U通过的方法
在Windows 2008 R2上安装了Serv-U FTP服务端软件之后,无法通过客户端连接,究其原因是Windows 2008的防火墙没有开启FTP端口,而且在防火墙上添加Serv-U程序也不行, ...
- Get和Post区别,EncType提交数据的格式详解——转自他人博客的
1. get是从服务器上获取数据,post是向服务器传送数据. 2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到.post是通过 ...
- Unity Shader 学习笔记(一)
_MainTex_ST (1)简单来说,TRANSFORM_TEX(tex,name) (tex.xy * name##_ST.xy + name##_ST.zw)主要作用是拿顶点的uv去和材质球的t ...
- JQuery中的prop和attr
prop和attr都可以用来获取并改变对象的属性, 对于HTML元素本身就带有的固有属性,在处理时,使用prop方法. 对于HTML元素我们自己自定义的DOM属性,在处理时,使用attr方法. 栗子: ...
- vue监听input标签的value值方法
<input id="materialSearch" type="text" @keyup.enter="search" @input ...
- 《Cron表达式详解》
Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式: Seconds Minutes Hours DayofMonth Month ...