spring boot设置过滤器、监听器及拦截器的方法

前言

其实这篇文章算不上是springboot的东西,我们在spring普通项目中也是可以直接使用的

设置过滤器:

以前在普通项目中我们要在web.xml中进行filter的配置,但是只从servlet 3.0后,我们就可以在直接在项目中进行filter的设置,因为她提供了一个注解@WebFilter(在javax.servlet.annotation包下),使用这个注解我们就可以进行filter的设置了,同时也解决了我们使用springboot项目没有web.xml的尴尬,使用方法如下所示

@WebFilter(urlPatterns="/*",filterName="corsFilter", asyncSupported = true)
public class CorsFilter implements Filter{

 @Override
 public void init(FilterConfig filterConfig) throws ServletException {

 }

 @Override
 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
   FilterChain chain) throws IOException, ServletException {
  HttpServletResponse response = (HttpServletResponse)servletResponse;
  HttpServletRequest request = (HttpServletRequest)servletRequest;
  chain.doFilter(servletRequest, servletResponse);
 }

 @Override
 public void destroy() {

 }

}

其实在WebFilter注解中有一些属性我们需要进行设置, 比如value、urlPatterns,这两个属性其实都是一样的作用,都是为了设置拦截路径,asyncSupported这个属性是设置配置的filter是否支持异步响应,默认是不支持的,如果我们的项目需要进行请求的异步响应,请求经过了filter,那么这个filter的asyncSupported属性必须设置为true不然请求的时候会报异常。

设置拦截器:

编写一个配置类,继承org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter或者org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport并重写addInterceptors(InterceptorRegistry registry)方法,其实父类的addInterceptors(InterceptorRegistry registry)方法就是个空方法。使用方法如下:

@Configuration
public class MvcConfig extends WebMvcConfigurationSupport {

 @Override
 public void addInterceptors(InterceptorRegistry registry) {
  InterceptorRegistration registration = registry.addInterceptor(new HandlerInterceptor() {
   @Override
   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    return true;
   }

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

   }

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

   }
  });
  // 配置拦截路径
  registration.addPathPatterns("/**");
  // 配置不进行拦截的路径
  registration.excludePathPatterns("/static/**");
 }
}

配置监听器:

一般我们常用的就是request级别的javax.servlet.ServletRequestListener和session级别的javax.servlet.http.HttpSessionListener,下面以ServletRequestListener为例,编写一个类实现ServletRequestListener接口并实现requestInitialized(ServletRequestEvent event)方法和requestDestroyed(ServletRequestEvent event)方法,在实现类上加上@WebListener(javax.servlet.annotation包下),如下所示

@WebListener
public class RequestListener implements ServletRequestListener {

 @Override
 public void requestDestroyed(ServletRequestEvent sre) {
  System.out.println("请求结束");
 }

 @Override
 public void requestInitialized(ServletRequestEvent sre) {
  System.out.println("请求开始");
 }
}

这样每一个请求都会被监听到,在请求处理前equestInitialized(ServletRequestEvent event)方法,在请求结束后调用requestDestroyed(ServletRequestEvent event)方法,其实在spring中有一个非常好的例子,就是org.springframework.web.context.request.RequestContextListener类

public class RequestContextListener implements ServletRequestListener {

  private static final String REQUEST_ATTRIBUTES_ATTRIBUTE =
      RequestContextListener.class.getName() + ".REQUEST_ATTRIBUTES";

  @Override
  public void requestInitialized(ServletRequestEvent requestEvent) {
    if (!(requestEvent.getServletRequest() instanceof HttpServletRequest)) {
      throw new IllegalArgumentException(
          "Request is not an HttpServletRequest: " + requestEvent.getServletRequest());
    }
    HttpServletRequest request = (HttpServletRequest) requestEvent.getServletRequest();
    ServletRequestAttributes attributes = new ServletRequestAttributes(request);
    request.setAttribute(REQUEST_ATTRIBUTES_ATTRIBUTE, attributes);
    LocaleContextHolder.setLocale(request.getLocale());
    RequestContextHolder.setRequestAttributes(attributes);
  }

  @Override
  public void requestDestroyed(ServletRequestEvent requestEvent) {
    ServletRequestAttributes attributes = null;
    Object reqAttr = requestEvent.getServletRequest().getAttribute(REQUEST_ATTRIBUTES_ATTRIBUTE);
    if (reqAttr instanceof ServletRequestAttributes) {
      attributes = (ServletRequestAttributes) reqAttr;
    }
    RequestAttributes threadAttributes = RequestContextHolder.getRequestAttributes();
    if (threadAttributes != null) {
      // We're assumably within the original request thread...
      LocaleContextHolder.resetLocaleContext();
      RequestContextHolder.resetRequestAttributes();
      if (attributes == null && threadAttributes instanceof ServletRequestAttributes) {
        attributes = (ServletRequestAttributes) threadAttributes;
      }
    }
    if (attributes != null) {
      attributes.requestCompleted();
    }
  }

}

在这个类中,spring将每一个请求开始前都将请求进行了一次封装并设置了一个threadLocal,这样我们在请求处理的任何地方都可以通过这个threadLocal获取到请求对象,好处当然是有的啦,比如我们在service层需要用到request的时候,可以不需要调用者传request对象给我们,我们可以通过一个工具类就可以获取,岂不美哉。

扩充:在springboot的启动类中我们可以添加一些ApplicationListener监听器,例如:

@SpringBootApplication
public class DemoApplication {

  public static void main(String[] args) {
    SpringApplication application = new SpringApplication(DemoApplication.class);
    application.addListeners(new ApplicationListener<ApplicationEvent>() {
      @Override
      public void onApplicationEvent(ApplicationEvent event) {
        System.err.println(event.toString());
      }
    });
    application.run(args);
  }
}

ApplicationEvent是一个抽象类,她的子类有很多比如ServletRequestHandledEvent(发生请求事件的时候触发)、ApplicationStartedEvent(应用开始前触发,做一些启动准备工作)、ContextRefreshedEvent(容器初始化结束后触发),其他还有很多,这里不再多说,但是这些ApplicationListener只能在springboot项目以main方法启动的时候才会生效,也就是说项目要打jar包时才适用,如果打war包,放在Tomcat等web容器中是没有效果的。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

(0)

相关推荐

  • SpringBoot定义过滤器、监听器、拦截器的方法

    一.自定义过滤器 创建一个过滤器,实现javax.servlet.Filter接口,并重写其中的init.doFilter.destory方法. package com.example.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.Se

  • SpringBoot拦截器的使用小结

    总结一下SpringBoot下拦截器的使用,步骤很简单: 1.自定义自己的拦截类,拦截类需要继承HandlerInterceptor接口并实现这个接口的方法. @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { //方法调用前执行 return true;//返回

  • Spring boot通过HttpSessionListener监听器统计在线人数的实现代码

    首先说下,这个统计在线人数有个缺陷,一个人在线可以同时拥有多个session,导致统计有一定的不准确行. 接下来,开始代码的编写, 第一步:实现HttpSessionListener中的方法,加上注解@WebListener @WebListener public class SessionListener implements HttpSessionListener{ public void sessionCreated(HttpSessionEvent arg0) { // TODO Aut

  • 详解SpringBoot AOP 拦截器(Aspect注解方式)

    常用用于实现拦截的有:Filter.HandlerInterceptor.MethodInterceptor 第一种Filter属于Servlet提供的,后两者是spring提供的,HandlerInterceptor属于Spring MVC项目提供的,用来拦截请求,在MethodInterceptor之前执行. 实现一个HandlerInterceptor可以实现接口HandlerInterceptor,也可以继承HandlerInterceptorAdapter类,两种方法一样.这个不在本文

  • springboot实现拦截器之验证登录示例

    整理文档,搜刮出一个springboot实现拦截器之验证登录示例,稍微整理精简一下做下分享. 添加jar包,这个jar包不是必须的,只是在拦截器里用到了,如果不用的话,完全可以不引入 <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.5</version> </dep

  • Spring Boot的listener(监听器)简单使用实例详解

    监听器(Listener)的注册方法和 Servlet 一样,有两种方式:代码注册或者注解注册 1.代码注册方式 通过代码方式注入过滤器 @Bean public ServletListenerRegistrationBean servletListenerRegistrationBean(){ ServletListenerRegistrationBean servletListenerRegistrationBean = new ServletListenerRegistrationBean

  • spring boot如何添加拦截器

    构建一个spring boot项目. 添加拦截器需要添加一个configuration @Configuration @ComponentScan(basePackageClasses = Application.class, useDefaultFilters = true) public class ServletContextConfig extends WebMvcConfigurationSupport { 为了方便扫描位置,我们可以写一个接口或者入口类Application放置于最外

  • springboot 用监听器统计在线人数案例分析

    本文在springboot 的项目,用HttpSessionListener 监听器(监听器的其中一种) 统计在线人数,实质是统计session 的数量. 思路很简单,但是有个细节没处理好,让我调试了大半天,才把bug搞好. 先写个HttpSessionListener 监听器.count  是session的数量(人数),session 创建的时候,会触发监听器的sessionCreated 方法,session销毁的时候,会触发监听器的sessionDestroyed 方法. 在监听器中计算

  • spring boot实现过滤器和拦截器demo

    整理文档,搜刮出一个spring boot实现过滤器和拦截器demo ,稍微整理精简一下做下分享. 拦截器定义: @WebServlet public class ActionInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Ex

  • spring boot的拦截器简单使用示例代码

    1.spring boot拦截器默认有: HandlerInterceptorAdapter AbstractHandlerMapping UserRoleAuthorizationInterceptor LocaleChangeInterceptor ThemeChangeInterceptor 其中 LocaleChangeInterceptor 和 ThemeChangeInterceptor 比较常用. 2.实现自定义拦截器只需要3步: 1).创建我们自己的拦截器类并实现 Handler

随机推荐