丁香婷婷色五月激情综合深爱

发布日期:2022-06-18 17:04    点击次数:78

过滤器Filter和阻挡器Interceptor的有关和分手

本文将对阻挡器Interceptor进行通俗素质,并通过几个例子对它们的各别进行简要分析。

阻挡器Interceptor简介

一个期骗中不错界说多个阻挡器,spring在技俩启动时,会将这些阻挡器注册进来,并按照默许轨则进行排序。淌若是自界说的阻挡器,可手动建筑阻挡器调用的先后规则。

各阻挡器是链式调用,一个央求不错触发多个阻挡器,每个阻挡器的调用会按照它加载到spring中的规则挨次实施。

阻挡器中有3个步伐,功能如下:

preHandle:该步伐在调用Controller步伐或取得静态资源前被调用(静态资源包括html、js等)。 postHandle:该步伐在调用Controller步伐或取得静态资源后,然而视图还莫得被渲染前调用。 afterCompletion:该步伐在视图渲染后进行调用,主要用来撤消资源。 自界说阻挡器Interceptor 
public class MyInterceptor implements HandlerInterceptor {     @Override     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {         System.out.println("调用preHandle");         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 ex) throws Exception {         System.out.println("调用afterCompletion");     } } 
注册自界说阻挡器Interceptor

编写设置类并已毕WebMvcConfigurer接口。 

@Configuration public class MyWebConfig implements WebMvcConfigurer {     @Override     public void addInterceptors(InterceptorRegistry registry) {         registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");     } } 
过滤器Filter和阻挡器Interceptor分手

过滤器和阻挡器都不错已毕举例编码建筑、日记纪录、权限落拓等功能,然而二者仍是有好多分手的。

(1)已毕旨趣不同

Filter是基于函数回调已毕的:

每个自界说过滤器都会已毕一个doFilter()步伐,这个步伐有一个谬误参数FilterChain。它是一个回调接口,ApplicationFilterChain是它的具体已毕类,该类里面也有一个doFilter()步伐,这个步伐即是回调步伐(ps:不错融会为步伐递归调用,检讨源码比较容易融会)。

假定有2个滤器, 性生大片免费观看网站精彩短片调用进程图如下(ps:画的比较详尽): 

两个过滤器实施进程 

Interceptor是基于反射已毕的:

为什么说阻挡器是基于反射已毕的呢?个人融会在阻挡器里面的三个步伐中,都有一个共同的参数handler,这个参数里包含的信息比较丰富。包含该央求所对应的步伐、步伐地方的Controller、步伐参数等信息,而这些信息都是spring通过反射加载进来的。恰是由于这些丰富的参数,使得阻挡的功能比拟过滤器功能更庞杂。 

 handler参数信息 

(2)使用限度不同

过滤器Filter已毕了javax.servlet.Filter接口,也即是说过滤器的使用要依赖于Tomcat等容器,是以它只可在web材干中使用。

阻挡器Interceptor已毕了

org.springframework.web.servlet接口,它是由Spring容器进行解决,并不依赖Tomcat等容器,既不错期骗在web材干中,也不错期骗在非web材干中。

(3)触发时机不同

过滤器Filter是在央求插足Tomcat等容器后,servlet处理之前进行调用的。

阻挡器Interceptor是在央求插足servlet后,丁香婷婷色五月激情综合深爱实施Controller之前进行调用的。

(4)阻挡限度不同

过滤器Filter确实不错阻挡统统插足容器的央求。

阻挡器Interceptor只会对Controller央求或探访static目次下的静态资源央求起作用。

(5)启动化时机不同

过滤器Filter是跟着Tomcat等web容器启动时而进行启动化。

阻挡器Interceptor时跟着spring启动而进行启动化。

过滤器和阻挡器若何注入依赖干事

在本色开拓中,当使用到过滤器或阻挡器时,不免会引入一些依赖的service干事。底下就通过例子进行简要说明:

Filter依赖service:凯旋接纳注解@Autowired即可。 

@WebFilter(urlPatterns = {"/user/*"}) @Log4j2 public class MyFilter implements Filter {     @Autowired     private UserService userService;          @Override     public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {         HttpServletRequest httpServletRequest = (HttpServletRequest) request;         log.info("Filter取得到央求地址:" + httpServletRequest.getServletPath());         filterChain.doFilter(request, response);          HttpServletResponse httpServletResponse = (HttpServletResponse) response;         log.info("Filter取得到反应类型:" + httpServletResponse.getContentType());     }      @Override     public void init(FilterConfig filterConfig) throws ServletException {         System.out.println("Filter跟着项盘算启动而启动,只启动化一次");     }      @Override     public void destroy() {         System.out.println("Filter跟着web项盘算罢手而捐躯,完成资源回收");     } } 

Interceptor依赖service:凯旋接纳注解@Autowired,然而在将阻挡器注入到spring容器中时,弗成我方通过new来进行创建。需要将阻挡器当做一个平庸的bean注入到spring容器中,这么就不错将service注入到阻挡器中。 

public class MyInterceptor implements HandlerInterceptor {     @Autowired     private UserService userService;          @Override     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {         System.out.println("调用preHandle");         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 ex) throws Exception {         System.out.println("调用afterCompletion");     } } 

 

@Configuration public class MyWebConfig implements WebMvcConfigurer {      @Bean     public MyInterceptor getMyInterceptor(){         return new MyInterceptor();     }      @Override     public void addInterceptors(InterceptorRegistry registry) {         // getMyInterceptor()这种注册形势不错在阻挡器里注入bean         registry.addInterceptor(getMyInterceptor()).addPathPatterns("/**");         // 这种注册形势由于是我方new出来的,是以在阻挡器里注册的bean都为null         registry.addInterceptor(new MyInterceptor2()).addPathPatterns("/**");     } } 
过滤器和阻挡器若何指定加载规则

(1)Filter:需要通过设置类指定加载规则,值越小,越先实施。接纳@WebFilter无法指定规则。 

@Bean public FilterRegistrationBean myFilter(){     MyFilter myFilter = new MyFilter();     FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(myFilter);     filterRegistrationBean.setUrlPatterns(Arrays.asList("/user/*"));     filterRegistrationBean.setOrder(2);     return filterRegistrationBean; } 

(2)Interceptor:需要通过设置类指定加载规则,值越小,越先实施。 

@Configuration public class MyWebConfig implements WebMvcConfigurer {     @Override     public void addInterceptors(InterceptorRegistry registry) {         // getMyInterceptor()这种注册形势不错在阻挡器里注入bean         registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").order(1);         // 这种注册形势由于是我方new出来的,是以在阻挡器里注册的bean都为null         registry.addInterceptor(new MyInterceptor2()).addPathPatterns("/**").order(2);     } } 
过滤器Filter和阻挡器Interceptor使用场景

二者比拟阻挡器功能更庞杂些,Filter能做的事情,它都能做,况且不错在央求前,央求后实施,比较纯真。Filter主要用来建筑字符编码、过滤明锐词汇和URL级别的通俗权限落拓。淌若需要纪录比较精通的信息或比较复杂的权限解决,仍是提出用阻挡器已毕。

拓展

Servlet和Controller的分手是什么?

使用Servlet不错集会来自网页表单的用户输入,还不错动态创建网页。DispatcherServlet是SpringMVC中唯独的Servlet,Servlet容器(Tomcat)把统统的央求都转发到DispatcherServlet,然后通过HandlerMapping把央求路由到具体的Controller中。因此,Controller仅仅一个平庸的Java Bean。

 





Powered by 东北女人毛多水多牲交视频 @2013-2022 RSS地图 HTML地图