java过滤器和拦截器的区别和使用场景,javaweb过滤器和拦截器

  java过滤器和拦截器的区别和使用场景,javaweb过滤器和拦截器

  

目录

流程图拦截器相对过滤器学习笔记一技术架构图项目演示依赖拦截机拦截器过滤器过滤器1、多过滤器不指定过滤顺序2、多过滤器指定过滤顺序

 

  

流程图

 

  

拦截器vs过滤器

拦截器是学习笔记一的技术

 

  过滤器的小型应用程序的技术

  先过过滤器,过滤器过完才到前端控制器

  拦截器归属于SpringMVC,只可能拦学习笔记一的东西;

  拦截器说白了就是为了增强,可以在请求前进行增强,也可以在请求后进行增强,但是不一定同时在前后都增强。

  区别

  

SpringMVC技术架构图

 

  

项目Demo

项目地址

 

  

依赖

父groupIdorg.springframework.boot/groupId人工弹簧-启动-母公司/version2.2.7.RELEASE/version/人工弹簧父依赖关系groupIdorg.springframework.boot/groupId artifact id spring-boot-starter-web/artifact id/dependency/dependencies

 

  

Interceptor拦截器

包com。测试。过滤测试。inter导入org。spring框架。刻板印象。组件;导入org。spring框架。网络。servlet。处理者受体;导入org。spring框架。网络。servlet。模型和视图;导入javax。servlet。http。http servlet请求;导入javax。servlet。http。http servlet响应;/** * 拦截器* * @作者:张曾秀* @创建日期: 2022/4/22 */@组件公开类测试接口1实现处理程序eptor { @ Override public boolean preHandle(http servlet请求请求,HttpServletResponse响应,对象处理程序)抛出异常{系统。出去。println(测试inter 1预处理. );返回true} @覆盖公共void post句柄(http servlet请求请求,HttpServletResponse响应,对象处理程序,ModelAndView modelAndView)引发异常{系统。出去。println(测试内部1个post句柄. ));} @完成后覆盖公共void(http servlet请求请求,HttpServletResponse响应,对象处理程序例外情况)抛出异常{ System.out.println(TestInt

 

  er1 afterCompletion..."); }}Interceptor拦截器要注册

  

package com.test.filtertest.config;import com.test.filtertest.inter.TestInter1;import com.test.filtertest.inter.TestInter2;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/** * @author zhangzengxiu * @date 2022/4/22 */@Configurationpublic class WebConfig implements WebMvcConfigurer { @Autowired private TestInter1 testInter1; @Autowired private TestInter2 testInter2; @Override public void addInterceptors(InterceptorRegistry registry) { //默认/** 拦截所有请求 registry.addInterceptor(testInter1).addPathPatterns("/**"); registry.addInterceptor(testInter2); }}

拦截顺序

 

  多拦截器拦截顺序取决于registry的注册顺序

  

 

  

Filter过滤器

 

  

1、多Filter不指定过滤顺序

package com.test.filtertest.filter;import org.springframework.core.annotation.Order;import javax.servlet.*;import javax.servlet.annotation.WebFilter;import java.io.IOException;/** * @author zhangzengxiu * @date 2022/4/22 */@WebFilter(filterName = "TestFilter1", urlPatterns = "/*")//@Order(2) //filter这样定义拦截顺序无效,还是会按照类名去拦截public class TestFilter1 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("TestFilter1 filter before ..."); filterChain.doFilter(servletRequest, servletResponse); System.out.println("TestFilter1 filter after ..."); } @Override public void destroy() { }}

加了@WebFilter注解的过滤器要生效,需要在启动类上加一个注解@ServletComponentScan

 

  

 

  

2、多Filter指定过滤顺序

如果要设置过滤顺序的话,在Filter上添加@Order 不会生效,还是会默认根据Filter过滤器的类名去进行过滤。

 

  如果想要指定拦截顺序,需要添加一个配置类,通过设置Order的值去设置过滤顺序,Order数值越小优先级越高

  

package com.test.config;import com.test.filter.TestFilter1;import com.test.filter.TestFilter2;import org.springframework.boot.web.servlet.FilterRegistrationBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import javax.servlet.Filter;/** * filter过滤器配置 * * @author: zhangzengxiu * @createDate: 2022/4/24 */@Configurationpublic class FilterConfig { @Bean public FilterRegistrationBean testFilter1() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); Filter testFilter1 = new TestFilter1(); filterRegistrationBean.setFilter(testFilter1); filterRegistrationBean.addUrlPatterns("/*"); filterRegistrationBean.setName("testFilter1"); filterRegistrationBean.setOrder(2);//指定过滤顺序,数值越小优先级越高 return filterRegistrationBean; } @Bean public FilterRegistrationBean testFilter2() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); Filter testFilter2 = new TestFilter2(); filterRegistrationBean.setFilter(testFilter2); filterRegistrationBean.setName("testFilter2"); filterRegistrationBean.addUrlPatterns("/*"); filterRegistrationBean.setOrder(1);//指定过滤顺序,数值越小优先级越高 return filterRegistrationBean; }}

1、同时原本Filter过滤器上的@WebFilter(filterName = TestFilter1, urlPatterns = /*)

 

  这个注解最好去掉,否则bean重复会报错,要么bean名称不要重复,换个名称。但是不去掉的话@ServletComponentScan也要被保留,最好统一格式,只使用config配置。

  2、启动类上的@ServletComponentScan 注解也不需要了,可以去掉了,因为不用扫描@WebFilter注解了。但是如果@WebFilter还保留了,那么就不能去掉了。不然加了@WebFilter的过滤器就不会生效了,因为没扫到。

  

 

  到此这篇关于一文详解Java拦截器与过滤器的使用的文章就介绍到这了,更多相关Java拦截器 过滤器内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: