Filter

Filter是Servlet容器实现的,并不是由Spring 实现的

下面是一个例子

import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.filter.OncePerRequestFilter; /**
* @date: 2020-09-02
*/
@Slf4j
public class MyFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
log.info("filter - request : {}, response : {}", request, response);
filterChain.doFilter(request, response);
}
}

HandlerInterceptorAdapter

HandlerInterceptorAdapter 是Spring 通过Aop来实现的

下面是一个例子

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; /**
* @date: 2020-09-02
*/
@Slf4j
public class MyInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
log.info("HandlerInterceptorAdapter - request : {}, response : {}", request, response);
return true;
}
}

HandlerMethodArgumentResolver

通过它可以对controller方法里面的参数进行赋值,比如@RequestParam注解就是通过这个拦截器实现的

下面是一个例子

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface AddHello {
}
import javax.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer; /**
* @date: 2020-09-02
*/
@Slf4j
public class MyResolver implements HandlerMethodArgumentResolver { private static final String NAME_ATTRIBUTE = "name"; @Override
public boolean supportsParameter(MethodParameter parameter) {
log.info("supportsParameter, {}", parameter);
return parameter.hasParameterAnnotation(AddHello.class);
} @Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
log.info("resolveArgument, {}", request);
return request == null ? null : "hello, " + request.getParameter(NAME_ATTRIBUTE);
}
}

config(配置类)

import java.util.List;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /**
* @date: 2020-09-02
*/
@Configuration
public class WebConfig implements WebMvcConfigurer { @Bean
public FilterRegistrationBean<MyFilter> myFilterRegistrationBean() {
FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean();
MyFilter i18nFilter = new MyFilter();
registrationBean.setFilter(i18nFilter);
registrationBean.addUrlPatterns("/*");
registrationBean.setOrder(1);
return registrationBean;
} @Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor());
} @Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new MyResolver());
}
}
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; /**
* @date: 2020-09-02
*/
@RestController
@RequestMapping("/hello")
public class HelloController {
@GetMapping
public String get(HttpServletRequest request, String name, @AddHello String hello) {
return hello;
}
}

实验结果

当你访问 http://127.0.0.1:8443/hello?name=abc时,会返回 hello, abc,这是因为Resolver将信息注入到hello参数中了

并且打印的日志如下,可以看到MyFilter、MyInterceptor和MyResolver都拦截到了。

10758 2020-09-02 21:30:37.272 [http-nio-8443-exec-1] INFO  c.e.d.s.a.intercept.MyFilter - filter - request : org.apache.catalina.connector.RequestFacade@27e424a4, response : org.apache.catalina.connector.ResponseFacade@37897bdf
10766 2020-09-02 21:30:37.280 [http-nio-8443-exec-1] INFO c.e.d.s.a.intercept.MyInterceptor - HandlerInterceptorAdapter - request : org.apache.catalina.connector.RequestFacade@27e424a4, response : org.apache.catalina.connector.ResponseFacade@37897bdf
10778 2020-09-02 21:30:37.292 [http-nio-8443-exec-1] INFO c.e.d.s.a.intercept.MyResolver - supportsParameter, method 'get' parameter 1
10783 2020-09-02 21:30:37.297 [http-nio-8443-exec-1] INFO c.e.d.s.a.intercept.MyResolver - supportsParameter, method 'get' parameter 2
10783 2020-09-02 21:30:37.297 [http-nio-8443-exec-1] INFO c.e.d.s.a.intercept.MyResolver - resolveArgument, org.apache.catalina.connector.RequestFacade@27e424a4

在Spring中拦截器的使用的更多相关文章

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

    spring 中拦截器 与servlet 的filter 有相似之处.比如二者都是aop 编程思想的体现都能实现权限检查,日志记录等. 不同之处 使用范围不同 Filter 是Servlet 规定的. ...

  2. 从零开始学 Java - Spring AOP 拦截器的基本实现

    一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过 ...

  3. spring mvc拦截器

    Java里的拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取act ...

  4. Spring使用拦截器支持国际化(转)

    Spring使用拦截器支持国际化很方便,使用时只需要两个步骤: 一.spring配置 具体配置方式如下: <!-- 资源文件绑定器,文件名称:messages.properties(没有找到时的 ...

  5. shiro中拦截器机制

    8.1 拦截器介绍 Shiro使用了与Servlet一样的Filter接口进行扩展:所以如果对Filter不熟悉可以参考<Servlet3.1规范>http://www.iteye.com ...

  6. Java - Spring AOP 拦截器的基本实现

    一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过 ...

  7. spring mvc拦截器原理分析

    我的springMVC+mybatis中的interceptor使用@autowired注入DAO失败,导致报空指针错误,这个是为什么呢? :空指针说明没有注入进来,你可以检查一下你的这个拦截器int ...

  8. SSM(spring mvc+spring+mybatis)学习路径——2-2、spring MVC拦截器

    目录 2-2 Spring MVC拦截器 第一章 概述 第二章 Spring mvc拦截器的实现 2-1 拦截器的工作原理 2-2 拦截器的实现 2-3 拦截器的方法介绍 2-4 多个拦截器应用 2- ...

  9. Spring 注解拦截器使用详解

    Spring mvc拦截器 平时用到的拦截器通常都是xml的配置方式.今天就特地研究了一下注解方式的拦截器. 配置Spring环境这里就不做详细介绍.本文主要介绍在Spring下,基于注解方式的拦截器 ...

随机推荐

  1. iptables基础实战练习

    目录: 一.基本规则练习 二.SNAT源地址转移 三.DNAT目标地址转移 一.基础规则练习 (1) 放行ssh (端口:22) 1 iptables -A INPUT -d 192.168.42.1 ...

  2. Spring学习总结(1)-注入方式

    Spring实现IOC的思路是提供一些配置信息用来描述类之间的依赖关系,然后由容器去解析这些配置信息,继而维护好对象之间的依赖关系,前提是对象之间的依赖关系必须在类中定义好,比如A.class中有一个 ...

  3. MyBatis-Plus使用(1)-概述+代码生成器

    MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生. 官网:https://mp.baomidou.com ...

  4. Chrome自动格式化Json输出

    对JSON格式的内容进行浏览和编辑,以树形图样式展现JSON文档,并可实时编辑 安装 Chrome商店 https://chrome.google.com/webstore/detail/json-h ...

  5. Java 程序员生产神器 IDEA 的常用快捷键、插件及设置

    对于 Java 程序员来说,使用 IDEA 集成环境是最称手的.优点不多讲,用过的人都知道.IDEA 虽好,但为了充分利用 IDEA 的优势,我分享一下我常用快捷键.插件和设置. 常用快捷键 Ctrl ...

  6. Django Web 测试

    Django 单元测试 模拟浏览器发起请求,测试 web 功能.只是简单记录一下怎么使用. 环境 Win10 Python2.7 Django 1.8.11 MySQL5.6 项目结构 大致如下 my ...

  7. .NET Core 微服务—API网关(Ocelot) 教程 [四]

    前言: 上一篇 介绍了Ocelot网关和认证服务的结合使用,本篇继续介绍Ocelot相关请求聚合和Ocelot限流 一.请求聚合 Ocelot允许声明聚合路由,这样可以把多个正常的Routes打包并映 ...

  8. 字节跳动:[编程题]万万没想到之聪明的编辑 Java

    时间限制:1秒 空间限制:32768K 我叫王大锤,是一家出版社的编辑.我负责校对投稿来的英文稿件,这份工作非常烦人,因为每天都要去修正无数的拼写错误.但是,优秀的人总能在平凡的工作中发现真理.我发现 ...

  9. C#设计模式之21-策略模式

    策略模式(Stragety Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/427 访问. 策略模式属于 ...

  10. C#LeetCode刷题之#206-反转链表(Reverse Linked List)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3828 访问. 反转一个单链表. 输入: 1->2-> ...