springboot拦截器和过滤器的区别与使用

article/2025/10/7 17:02:17

拦截器与过滤器的区别

spring的拦截器与servlet的filter有相似之处,比如二者都是AOP编程思想的体现,都能实现权限检查、日志记录等,不同的是:

  • 适用范围不同:filter是servlet规范规定的,只能用于web程序中;而拦截器既可用于web程序,也可用于application、swing程序中。
  • 规范不同:filter是servlet规范定义的,是servlet容器支持的,而拦截器是spring容器中的,是spring框架支持的。
  • 使用资源不同:同其他代码块一样,拦截器也是一个spring组件,归spring管理,配置在spring文件中,因此能使用spring里的任何资源、对象,例如service对象、数据源事务管理等,通过IOC注入到拦截器即可。而filter则不能。
  • 深度不同:Filter只能在servlet前后起作用。而拦截器能够深入到方法前后,异常抛出前后等,因此拦截器具有更大的弹性,在spring框架的程序中,优先使用拦截器。
    在这里插入图片描述

最简单明了的区别就是

  • 过滤器可以修改request,而拦截器不能
  • 过滤器需要在servlet容器中实现,拦截器可以适用于javaEE,javaSE等各种环境
  • 拦截器可以调用IOC容器中的各种依赖,而过滤器不能
  • 过滤器只能在请求的前后使用,而拦截器可以详细到每个方法

拦截器的使用

拦截器(Interceptor)和过滤器不同(filter),但是也可以实现方法前中后的处理策略,一般情况是进入方法前进行拦截,然后进行身份验证。下面是实现进入方法前的身份,这里是使用groovy写的,与java略有差异
1、实现拦截器

@Component
@Slf4j
class SecurityInterceptor implements HandlerInterceptor {String account_interface_url@Value('${account_interface_url}')void setAccount_interface_url(String account_interface_url) {this.account_interface_url = account_interface_url}//Controller逻辑执行之前@Overrideboolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {def name,ticketresponse.setCharacterEncoding("UTF-8")if(!request.getHeader("ticket")){JSONObject json = new JSONObject()json.put("code","1")json.put("msg","认证失败,无访问权限")response.getWriter().write(json.toString())return false}ticket = request.getHeader("ticket").toString()if(handler instanceof HandlerMethod){name = handler.getMethod().getName().toString()}def url = String.format(account_interface_url,ticket,"test111")println name//这里是远程调用权限接口def account = Http.http_request(url)println accountJSONObject account_result = new JSONObject(account)if(account_result.has("status")&& account_result.getString("status") == "NOT_FOUND"){JSONObject json = new JSONObject()json.put("code","1")json.put("msg","认证失败,无访问权限")response.getWriter().write(json.toString())return false}return true}//Controller逻辑执行完毕但是视图解析器还未进行解析之前@Overridevoid postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {}//Controller逻辑和视图解析器执行完毕@Overridevoid afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {}
}

2、注册拦截器
实现拦截器后需要将拦截器注册到spring容器中,可以通过implements WebMvcConfigurer覆盖addInterceptor方法,把Bean注册到Spring容器中,可以选择@Component 或者 @Configuration。

@Configuration
class SecurityConfigurer implements WebMvcConfigurer{@BeanSecurityInterceptor securityInterceptor(){return new SecurityInterceptor()}@Overridevoid addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(securityInterceptor()).addPathPatterns("/**").excludePathPatterns("/*.html")}
}

相信很多人对preHandle方法中的HttpServletReques, HttpServletResponse , handler这三个类的功能比较模糊,所以在这里进行简单的介绍。
3、HttpServletRequest
web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象,和代表响应的response对象。他们分别代表着请求和响应,如果需要客户端提交过来的数据,只需要request对象就可以,如果要向客户端发送信息,就需要response对象。
HttpServletRequest代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。
获得客户端信息:

方法说明
getRequestURL()返回客户端发出请求时的完整URL。
getRequestURI()返回请求行中的参数部分。
getQueryString ()方法返回请求行中的参数部分(参数名+值)
getRemoteHost()返回发出请求的客户机的完整主机名。
getRemoteAddr()返回发出请求的客户机的IP地址。
getPathInfo()返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以"/"开头。
getRemotePort()返回客户机所使用的网络端口号。
getLocalAddr()返回WEB服务器的IP地址。
getLocalName()返回WEB服务器的主机名。

获取客户端请求头

方法说明
getHeader(string name)以 String 的形式返回指定请求头的值。如果该请求不包含指定名称的头,则此方法返回 null。如果有多个具有相同名称的头,则此方法返回请求中的第一个头。头名称是不区分大小写的。可以将此方法与任何请求头一起使用
getHeaders(String name)以 String 对象的 Enumeration 的形式返回指定请求头的所有值
getHeaderNames()返回此请求包含的所有头名称的枚举。如果该请求没有头,则此方法返回一个空枚举

获得客户机请求参数

方法说明
getParameter(String name)根据name获取请求参数(常用)
getParameterValues(String name)根据name获取请求参数列表(常用)
getParameterMap()返回的是一个Map类型的值,该返回值记录着前端(如jsp页面)所提交请求中的请求参数和请求参数值的映射关系。(编写框架时常用)

4、HttpServletResponse
HttpServletResponse对象代表服务器的响应。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。查看HttpServletResponse的API,可以看到这些相关的方法。
response对象的功能分为以下四种:

  • 设置响应头信息
  • 发送状态码
  • 设置响应正文
  • 重定向
    4.1 设置响应头信息
方法说明
addHeader(String name, String value)添加具有给定名称和值的响应标头。此方法允许响应标头具有多个值。
addDateHeader(String name, long date)添加具有给定名称和日期值的响应标头。 日期以自纪元以来的毫秒数指定。 此方法允许响应标头具有多个值
addIntHeader(String name, int value)添加具有给定名称和整数值的响应标头。 此方法允许响应标头具有多个值
containsHeader(String name)返回一个布尔值,指示是否已设置命名的响应标头
setHeader同add方法
setDateHeader同add方法
setIntHeader同add方法

4.2 设置状态码

方法说明
setStatus(int sc)设置此响应的状态代码。 此方法用于设置没有错误时的返回状态码(例如,对于状态码 SC_OK 或 SC_MOVED_TEMPORARILY)。 如果出现错误,并且调用者希望调用 Web 应用程序中定义的错误页面,则应改用 sendError 方法
setStatus(int sc, String sm)设置此响应的状态代码和消息

常用的状态码

Namediscribtion释义
200SC_OK此次请求已经成功
301SC_MOVED_PERMANENTLY请求的网页已永久移动到新位置
302SC_MOVED_TEMPORARILY临时移动、请求地址不变
401SC_UNAUTHORIZED未授权、用户需登录
403SC_FORBIDDEN服务器拒绝了此次请求(权限问题)
404SC_NOT_FOUND服务器没找到URI匹配的
405SC_METHOD_NOT_ALLOWED调用的方法不允许使用(get、post不匹配)
500SC_INTERNAL_SERVER_ERROR服务器内部发生异常,请求中断
502SC_BAD_GATEWAY网关错误(如Nginx),无法收到服务器的响应
504SC_GATEWAY_TIMEOUT请求超时,在约定时间内没有收到Http响应

4.3 发送响应正文
4.3.1 使用OutputStream流输出中文
这段是参考javaweb学习总结(七)——HttpServletResponse对象(一)是java代码。

		String data = "中国";OutputStream outputStream = response.getOutputStream();//获取OutputStream输出流response.setHeader("content-type", "text/html;charset=UTF-8");//通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码/*** data.getBytes()是一个将字符转换成字节数组的过程,这个过程中一定会去查码表,* 如果是中文的操作系统环境,默认就是查找查GB2312的码表,* 将字符转换成字节数组的过程就是将中文字符转换成GB2312的码表上对应的数字* 比如: "中"在GB2312的码表上对应的数字是98*         "国"在GB2312的码表上对应的数字是99*//*** getBytes()方法如果不带参数,那么就会根据操作系统的语言环境来选择转换码表,如果是中文操作系统,那么就使用GB2312的码表*/byte[] dataByteArr = data.getBytes("UTF-8");//将字符转换成字节数组,指定以UTF-8编码进行转换outputStream.write(dataByteArr);//使用OutputStream流向客户端输出字节数组

4.3.2 使用PrintWriter流向客户端浏览器输出中文数据

//将字符以"UTF-8"编码输出到客户端浏览器
response.setCharacterEncoding("UTF-8")
//获取输出流,写入数据
response.getWriter().write("hello world")

4.4 重定向
重定向的方法

response.setHeader("Location", "http://www.itcast.cn");
response.sendRedirect("http://www.itcast.cn");

5、HandlerMethod
Spring MVC应用启动时会搜集并分析每个Web控制器方法,从中提取对应的"<请求匹配条件,控制器方法>“映射关系,形成一个映射关系表保存在一个RequestMappingHandlerMapping bean中。然后在客户请求到达时,再使用RequestMappingHandlerMapping中的该映射关系表找到相应的控制器方法去处理该请求。在RequestMappingHandlerMapping中保存的每个”<请求匹配条件,控制器方法>"映射关系对儿中,"请求匹配条件"通过RequestMappingInfo包装和表示,而"控制器方法"则通过HandlerMethod来包装和表示。
一个HandlerMethod对象,可以认为是对如下信息的一个包装 :

信息名称介绍
Object beanWeb控制器方法所在的Web控制器bean。可以是字符串,代表bean的名称;也可以是bean实例对象本身
Class beanTypeWeb控制器方法所在的Web控制器bean的类型,如果该bean被代理,这里记录的是被代理的用户类信息
Method methodWeb控制器方法
Method bridgedMethod被桥接的Web控制器方法
MethodParameter[] parametersWeb控制器方法的参数信息:所在类所在方法,参数,索引,参数类型
HttpStatus responseStatus注解@ResponseStatus的code属性
String responseStatusReason注解@ResponseStatus的reason属性

下面,是HandlerMethodn属性字段的源码

public class HandlerMethod {// 虽然Object类型,但是注册handlerMethod时候构造的时候有可能传入的是一个String类型的bean nameprivate final Object bean;// 见名知义,我调试的时候,传入的是DefaultListableBeanFactory,如果bean属性是Sring的beanName就可以用beanName获取到对应的bean作用Handlerprivate final BeanFactory beanFactory;// 方法所属类private final Class<?> beanType;// 注册的方法private final Method method;// 被桥接的方法,如果method是原生的,这个属性的值就是methodprivate final Method bridgedMethod;// 封装方法参数的类实例,一个MethodParameter就是一个参数private final MethodParameter[] parameters;// Http状态码private HttpStatus responseStatus;// ResponseStatus注解的reason值private String responseStatusReason;private HandlerMethod resolvedFromHandlerMethod;//...

http://chatgpt.dhexx.cn/article/5gECdPC0.shtml

相关文章

Springboot--拦截器、过滤器 区别,作用,实现方法

Springboot–拦截器、过滤器 拦截器和过滤器的区别 拦截器不依赖于servlet容器&#xff0c;这是springMVC自带的&#xff0c;过滤器依赖于servlet容器拦截器是基于java的反射机制&#xff0c;过滤器是基于函数的回调拦截器只能对action请求起作用&#xff0c;而过滤器可以对几…

Spring Boot拦截器与过滤器的区别

Spring Boot拦截器与过滤器的区别 在使用Spring Boot开发Web应用程序时&#xff0c;您可能需要在处理请求之前或之后执行某些操作。这些操作可以包括身份验证、日志记录、性能监测等。在这种情况下&#xff0c;您可以使用两种不同的机制&#xff1a;拦截器和过滤器。本文将介绍…

Springboot过滤器和拦截器的区别

上两篇文章我们介绍了过滤器Filter和拦截器Intercepter&#xff0c;其功能都是对请求进行拦截并对请求过滤&#xff0c;本篇文章就介绍一下两者的区别 1. 过滤器和拦截器的区别 过滤器和拦截器触发时机不一样&#xff0c;过滤器是在请求进入容器后&#xff0c;但请求进入serv…

关于拦截器与过滤器使用场景、拦截器与过滤器的区别整理

拦截器与过滤器的区别总结&#xff1a; 过滤器在web.xml中配置&#xff1a; &#xff08;1&#xff09;因为一开始在过滤器中映射的url-pattern填写路径是*.action。所有的action要经过它的过滤。<url-pattern>*.action</url-pattern> &#xff08;2&#xff09;…

彻底搞清拦截器和过滤器的区别

一、引言 本来想记录一下关于用户登陆和登陆之后的权限管理、菜单管理的问题&#xff0c;想到解决这个问题用到Interceptor&#xff0c;但想到了Interceptor&#xff0c;就想到了Filter&#xff0c;于是就想说一下它们的执行顺序和区别。关于Interceptor解决权限和菜单管理的问…

Spring拦截器和过滤器的区别及详解

拦截器和filter的功能都是拦截&#xff0c;filter是在servlet前执行的&#xff0c;拦截器拦截的是Spring MVC定义的概念。过滤器中包含拦截器&#xff0c;发送一个请求&#xff0c;先进行过滤器处理&#xff0c;看程序是否受理该请求。过滤器放过后&#xff0c;程序中的拦截器再…

拦截器与过滤器的区别

文章目录 一、二者理解过滤器&#xff08;Filter&#xff09;拦截器&#xff08;Interceptor&#xff09; 二、拦截器与过滤器的区别区别&#xff1a; 三、拦截器与过滤器的触发时机拦截器与过滤器触发时机不一样 四、使用场景五、图解 一、二者理解 过滤器&#xff08;Filter…

拦截器和过滤器的区别

1、实现原理不同 过滤器和拦截器底层实现方式大不相同&#xff0c;过滤器 是基于函数回调的&#xff0c;拦截器 则是基于Java的反射机制&#xff08;动态代理&#xff09;实现的。 2、使用范围不同 我们看到过滤器 实现的是 javax.servlet.Filter 接口&#xff0c;而这个接口是…

过滤器 和 拦截器的 6个区别,别再傻傻分不清了

周末有个小伙伴加我微信&#xff0c;向我请教了一个问题&#xff1a;老哥&#xff0c;过滤器 (Filter) 和 拦截器 (Interceptor) 有啥区别啊&#xff1f; 听到题目我的第一感觉就是&#xff1a;简单&#xff01; 毕竟这两种工具开发中用到的频率都相当高&#xff0c;应用起来也…

过滤器和拦截器的区别

文章目录 一、拦截器和过滤器的区别1、过滤器1、实现方式2、应用场景 2、拦截器1、实现方式2、应用场景 总结 一、拦截器和过滤器的区别 1、过滤器和拦截器触发时机不一样&#xff0c;过滤器是在请求进入容器后&#xff0c;但请求进入servlet之前进行预处理的。请求结束返回也…

过滤器和拦截器有什么区别?

过滤器&#xff08;Filter&#xff09;和拦截器&#xff08;Interceptor&#xff09;都是基于 AOP&#xff08;Aspect Oriented Programming&#xff0c;面向切面编程&#xff09;思想实现的&#xff0c;用来解决项目中某一类问题的两种“工具”&#xff0c;但二者有着明显的差…

面试篇-Spring 拦截器和过滤器的区别?

1、实现原理不同 过滤器和拦截器 底层实现方式大不相同&#xff0c;过滤器 是基于函数回调的&#xff0c;拦截器 则是基于Java的反射机制&#xff08;动态代理&#xff09;实现的。 2、使用范围不同 我们看到过滤器 实现的是 javax.servlet.Filter 接口&#xff0c;而这个接…

Nessus在线更新教程

前言&#xff1a;在线更新Nessus需要科学上网&#xff0c;没有工具无法更新。 1. 设置更新策略 这里选&#xff1a;更新所有的组件、频率选&#xff1a;每天&#xff0c;就可以 2. 检查是否有更新 3. 打开梯子&#xff0c;将梯子设置为全局模式 4. cmd命令行&#xff0c;进…

弱点扫描工具NESSUS详细教程

NESSUS • 家庭版 • 免费 • 专业版 • 收费、无限的并发连接 • 下载 • http://www.tenable.com/products/nessus/select-your-operating-system • 安装 • dpkg -i • 安装路径:/opt/nessus • 启动服务 • systemctl start nessusd.service • 管理地址 • https://12…

NESSUS使用笔记

Nessus 使用记录 启动nessus服务Nessus更新插件教程win10升级&#xff08;破解&#xff09;方法kali 进行升级(初始化完成后之后发现还是无法破解成功&#xff0c;看来kali系统无法使用这种方式进行破解了) 启动nessus服务 进入kali系统&#xff0c;终端输入如下命令&#xff…

Nessus学习

攻击主机&#xff1a; Kali 192.168.11.106 靶机&#xff1a;windows server 2008 r2 192.168.11.134 x64 32位 nessus 实验原理&#xff1a; 利用漏洞扫描器能够自动应用漏洞扫描原理&#xff0c;对目标主机安全漏洞进行检测&#xff0c;附带识别主机漏洞的特征库的功能&…

Nessus安全测试工具使用教程

Nessus安全测试工具使用教程 1.创建 New Scan扫描按钮 2.选择扫描策略 3.创建扫描成功 4.扫描结果

Nessus部署及简单使用

01 Nessus 简介 Nessus 是目前全世界最多人使用的系统漏洞扫描与分析软件。总共有超过75,000个机构使用 Nessus 作为扫描该机构电脑系统的软件。Nessus号称是世界上最流行的漏洞扫描程序,通常包括成千上万的最新的漏洞&#xff0c;各种各样的扫描选项&#xff0c;及易于使用的…

Nessus 使用学习

在看招聘软件的时候注意到有的招聘要求里写着会用 Nessus 这个软件&#xff0c;于是我好奇就下了这个软件。 在使用的过程中发现这也是个非常强大的渗透软件。&#xff08;总感觉自己有好多东西没学&#xff09; 1. 安装 在这里我使用的是 Windows 版本。安装可以说是非常简…

Windows版Nessus漏洞扫描器安装与使用

一、介绍、下载 适用版本&#xff1a;Windows 10 64位 Nessus版本&#xff1a;8.13.1 插件&#xff1a;all_2.0_20220618.tar 即2022年6月更新。 资源下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1Q_ywVkNqcu9WH_OJH03-iw 提取码&#xff1a;qsbo 二…