三种拦截方式分别为:

  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 集成三种拦截方式的更多相关文章

  1. Spring boot 集成三种定时任务方式

    三种定时任务方式分别为 org.springframework.scheduling.annotation.Scheduled java.util.concurrent.ScheduledExecut ...

  2. Spring Boot实践——三种拦截器的创建

    引用:https://blog.csdn.net/hongxingxiaonan/article/details/48090075 Spring中的拦截器 在web开发中,拦截器是经常用到的功能.它可 ...

  3. spring Bean的三种配置方式

    Spring Bean有三种配置方式: 传统的XML配置方式 基于注解的配置 基于类的Java Config 添加spring的maven repository <dependency> ...

  4. Spring Boot 项目几种启动方式

    Spring Boot 项目几种启动方式 1. 使用 main 启动 jar xxxx.jar 2. 使用 mvn 启动 mvn spring-boot:run 3. 使用 Spring Boot c ...

  5. Spring IOC以及三种注入方式

    IOC是spring的最基础部分,也是核心模块,Spring的其他组件模块和应用开发都是以它为基础的.IOC把spring的面向接口编程和松耦合的思想体现的淋漓尽致. IOC概念 IOC(Invers ...

  6. Spring IOC 中三种注入方式

    项目错误知识点记录 正文 最近在项目的时候,用到Spring框架,Spring框架提供了一种IOC的自动注入功能,可以很轻松的帮助我们创建一个Bean,这样就省的我们四处写new Object()这样 ...

  7. Spring:Spring-IOC三种注入方式、注入不同数据类型

    一.Spring IOC(依赖注入的三种方式): 1.Setter方法注入 package com.jpeony.spring.setter; import com.jpeony.spring.com ...

  8. Spring常用的三种注入方式

    好文要收藏,摘自:https://blog.csdn.net/a909301740/article/details/78379720 Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入 ...

  9. spring Bean的三种注入方式

    1.构造函数注入: 构造函数的注入方式分为很多种 (1)普通构造函数,空参数的构造函数 <bean id="exampleBean" class="examples ...

随机推荐

  1. appium手机自动化环境搭建

    在robotframework环境安装完成的基础上进行如下安装,如果没有安装rfs环境,请先参考robotframework安装文章:Robot Framework的环境搭建 文件下载地址:链接:ht ...

  2. Spring注入的反射解释

    对于如下配置片段:  <bean id="id" class="lee.Aclass">  <!--property配置需要依赖注入的属性-- ...

  3. 笔记-spring aop 原理学习2

    InstantiationAwareBeanPostProcessor AnnotationAwareAspectJAutoProxyCreator https://blog.csdn.net/qq_ ...

  4. c语言字符函数

    函数名: stpcpy 功  能: 拷贝一个字符串到另一个 用  法: char *stpcpy(char *destin, char *source); 程序例: #include <stdi ...

  5. 在rails 中使用mysql 出现Mysql::Error: Incorrect string value: 的问题

    这是因为你在做数据库的操作中有非英文的问题,之后gem mysql2 处理中文必须要数据库也指定是utf-8 才比较好处理 解决的方法很简单,将数据库每张表都转化成utf-8即可,如果数据库没有什么重 ...

  6. Spring Cloud学习笔记之微服务架构

    目录 什么是微服务 架构优点 架构的挑战 设计原则 什么是微服务     微服务构架方法是以开发一种小型服务的方式,来开发一个独立的应用系统的.     其中每个小型服务都运行在自己的进程中,并经常采 ...

  7. pat1033. To Fill or Not to Fill (25)

    1033. To Fill or Not to Fill (25) 时间限制 10 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 ZHANG, Gu ...

  8. 先定个小目标, 使用C# 开发的千万级应用

    dotNET跨平台 微信号 opendotnet 功能介绍 在这里你可以谈微软.NET,Mono的跨平台开发技术,也可以谈谈其他的跨平台技术.在这里可以让你的.NET项目有新的思路,不局限于微软的技术 ...

  9. schema中属性声明

    <attribute name="属性名"   default="默认值"  fixed="固定值" use="option ...

  10. td标签里内容不换行

    在一些页面开发中,除自己操作外,引起换行的情况一般有: Ex一.td标签里内容长度过长引起换行: Ex二.div标签(或其他标记)里内容有文本和图片引起换行: 解决方法: 针对例子一用<nobr ...