java创建请求拦截器_Springboot Spring拦截器实现及请求链路说明

Spring拦截器实现及请求链路说明

1.拦截器与过滤器的区别

1.1 JavaWeb三大组件

“ javaWeb有三大组件,分别是:servlet,Filter,Listener

1.1.1 Servlet

广义:Servlet是一个运行在web服务器或者应用服务器上的一个应用程序,用来动态处理客户端请求的资源。

狭义:Servlet是一个继承了GenericServlet类的子类。该类中的service方法用来处理相关的资源请求。

1.1.2 Listener

在Servlet规范中定义了多种类型的监听器。主要是三种域对象的监听ServletContext,HttpSession,HttpRequest,根据其功能可以划分为两类

三个域对象的销毁与创建

ServletContextListener

HttpServletListener

ServletRequestListener

域对象中的属性的变化

ServletContextAttributeListener

HttpServletAttributeListener

ServletRequestAttributeListener

1.1.3 Filter

Filter和Servlet类似。Servlet用来处理请求,而Filter用来拦截和放行请求。

作用:

在执行请求之前执行一段代码

是否让客户端访问目标资源

调用目标资源以后执行一段代码(通过生命周期函数完成)

Filter存在四种拦截方式

REQUESR 默认值,代表直接访问某个servlet

ERROR 发生错误时进行跳转

INCLUDE 包含资源时执行filter

FORWARD 转发时执行filter

1.2 Spring拦截器

spring拦截器是spring Aop的一种应用,在不修改源码的情况下,执行一段代码,以增强现有方法。

实现方式:

通过实现HandlerInterceptor接口,重写内部的三个方法

preHandler。在访问Controller之前执行,可以用来拦截请求

postHandler。在视图跳转或数据返回之前执行(return之前)

afterCompletion。在视图加载完成或数据返回完成以后执行

27043ad1234a0cbe6ca7f997ef9e81a2.png

1.3.Filter和Interceptor的区别

规范不同:Filter是Servlet规范中组件,在Servlet容器中生效,Interceptor是Spring框架支持的,在Spring上下文中生效。

作用范围不同:Servlet容器比Spring容器作用范围大

40f93e64fd2699ee0ff8d3c5ec32cb03.png

使用资源不同:Interceptor可以使用SpringIOC容器里面注入的Bean,Filter不可以使用注入的Bean。

d6979a13993ac2fa704a1c634850de19.png

粒度不同:过滤器范围更大,在拦截器外层对请求进行处理 适用系统级别的对所有API进行处理,如权限验证。

拦截器适合分模块,分业务的统一处理。

Filter是基于函数回调的,而Interceptor则是基于Java反射的。

Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。

Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。

Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。

在action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。

1.4过滤器和拦截器的执行步骤

ecf78689b561f397db10ad6fb1424ed5.png

过滤器(Filter)         :可以拿到原始的http请求,但是拿不到你请求的控制器和请求控制器中的方法的信息。

拦截器(Interceptor):可以拿到你请求的控制器和方法,却拿不到请求方法的参数。

切片   (Aspect)       :  可以拿到方法的参数,但是却拿不到http请求和响应的对象

c060cf66feb4f89d51aef9c7b47cd28f.png

2.SpringBoot使用拦截器

“ SpringBoot对MVC进行了自动配置,当需要使用拦截器的时候,需要在WebMvcConfigurer实现类中添加自定义的拦截器,并定义拦截路径和排除路径

使用@Component注解 进行依赖注入

com.zhl.springbootservlet.config.CustomHandlerInterceptor

import lombok.extern.slf4j.Slf4j;

import org.springframework.lang.Nullable;

import org.springframework.stereotype.Component;

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

@Slf4j

@Component

public class CustomHandlerInterceptor implements HandlerInterceptor {

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

log.info("preHandler:请求前调用");

/*返回False 则请求中断*/

return true;

}

@Override

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {

log.info("postHandler:请求后调用");

}

@Override

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {

log.info("afterCompletion:请求调用完成后回调方法,即在视图渲染完成后回调");

}

}

拦截器需要注册到配置类中

com.zhl.springbootservlet.config.MyWebMvcConfigurer

import org.springframework.context.annotation.Configuration;

import org.springframework.core.annotation.Order;

import org.springframework.web.servlet.config.annotation.InterceptorRegistry;

import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.annotation.Resource;

@Configuration

//老版本已废弃:public class MyWebMvcConfiguer extendx WebMvcConfigurerAdapter

public class MyWebMvcConfigurer implements WebMvcConfigurer {

@Resource

CustomHandlerInterceptor customHandlerInterceptor;

@Override

public void addInterceptors(InterceptorRegistry registry) {

/*

* 注册拦截器 拦截规则

* 多个拦截器时 依次添加,执行顺序按添加顺序

* */

registry.addInterceptor(customHandlerInterceptor).addPathPatterns("/*");

}

}

访问测试:

E:\09_JAVACODES_X>curl localhost:8080/hello

Hello World

2020-12-18 11:30:40.261 INFO 15200 --- [nio-8080-exec-1] c.z.s.config.CustomFilter : customFilter 请求处理之前--doFilter方法之前过滤请求

......

2020-12-18 11:30:40.273 INFO 15200 --- [nio-8080-exec-1] c.z.s.config.CustomHandlerInterceptor : preHandler:请求前调用

......

2020-12-18 11:30:40.289 INFO 15200 --- [nio-8080-exec-1] c.z.s.config.CumtomListener : session 创建

......

2020-12-18 11:30:40.315 INFO 15200 --- [nio-8080-exec-1] c.z.s.config.CustomHandlerInterceptor : postHandler:请求后调用

2020-12-18 11:30:40.316 INFO 15200 --- [nio-8080-exec-1] c.z.s.config.CustomHandlerInterceptor : afterCompletion:请求调用完成后回调方法,即在视图渲染完成后回调

2020-12-18 11:30:40.318 INFO 15200 --- [nio-8080-exec-1] c.z.s.config.CustomFilter : customFilter 请求处理之后--doFilter方法之后处理响应

2020-12-18 11:30:40.319 INFO 15200 --- [nio-8080-exec-1] c.z.s.config.CumtomListener : request 销毁

307eac3e8a72267c05a34641a1da8284.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值