当前位置: 代码迷 >> 综合 >> Spring Boot(五) filter/interceptor/listener
  详细解决方案

Spring Boot(五) filter/interceptor/listener

热度:30   发布时间:2023-12-22 02:05:51.0

当使用spring-Boot时,嵌入式Servlet容器通过扫描注解的方式注册Servlet、Filter和Servlet规范的所有监听器(如HttpSessionListener监听器)。
Spring boot 的主 Servlet 为DispatcherServlet,其默认的url-pattern为“/”。
过滤器属于Servlet范畴的API,与spring 没什么关系。
Web开发中,我们除了使用 Filter 来过滤请web求外,还可以使用Spring提供的HandlerInterceptor(拦截器)。

HandlerInterceptor 的功能跟过滤器类似,但是提供更精细的的控制能力:在request被响应之前、request被响应之后、视图渲染之前以及request全部结束之后。我们不能通过拦截器修改request内容,但是可以通过抛出异常(或者返回false)来暂停request的执行。

springboot 为过滤器和监听器提供了两种实现方式。
1.application注册
2.注解
自定义注解过滤器如:

@WebFilter(filterName = "authorizeFilter", urlPatterns = "/*")
public class BasicAuthorizeFilter implements Filter {private final static Logger LOGGER = LoggerFactory.getLogger(BasicAuthorizeFilter.class);@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// TODO Auto-generated method stubLOGGER.info("<<<<<<<<<<<<<<<<<<<<<过滤器处理中>>>>>>>>>>>>>>>>>>>>>>>>");chain.doFilter(request, response);
}@Override
public void init(FilterConfig arg0) throws ServletException {// TODO Auto-generated method stubLOGGER.info("\"<<<<<<<<<<<<<<<<<<<<<过滤器开始了>>>>>>>>>>>>>>>>>>>>>>>>\"");
}@Override
public void destroy() {// TODO Auto-generated method stubLOGGER.info("<<<<<<<<<<<<<<<<<<<<<过滤器结束了>>>>>>>>>>>>>>>>>>>>>>>>");}
}

并且在Application中,加上注解@ServletComponentScan实现Servlet扫描。

第二种在Application注册,添加相应的过滤器

@Bean
public FilterRegistrationBean filterRegistrationBean() {FilterRegistrationBean registrationBean = new FilterRegistrationBean();BasicAuthorizeFilter httpBasicFilter = new BasicAuthorizeFilter();registrationBean.setFilter(httpBasicFilter);List<String> urlPatterns = new ArrayList<>();urlPatterns.add("/*");registrationBean.setUrlPatterns(urlPatterns);return registrationBean;
}

自定义拦截器:

public class MyInterceptor implements HandlerInterceptor {private final static Logger LOGGER = LoggerFactory.getLogger(MyInterceptor.class);@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {LOGGER.info(">>>MyInterceptor>>>>>>>在请求处理之前进行调用");return true;// 只有返回true才会继续向下执行,返回false取消当前请求
}@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)throws Exception {LOGGER.info(">>>MyInterceptor>>>>>>>请求处理之后进行调用,但是在视图被渲染之前");
}@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception {LOGGER.info(">>>MyInterceptor>>>>>>>在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行");}
}

自定义监听器:

@WebListener
public class MyServletContextListener implements ServletContextListener {private final  static Logger LOGGER = LoggerFactory.getLogger(MyServletContextListener.class);
@Override
public void contextInitialized(ServletContextEvent sce) {LOGGER.info("<<<<<<<<<<<<<<<<<<上下文监听器开始了>>>>>>>>>>>>>>>>>>>");}@Override
public void contextDestroyed(ServletContextEvent sce) {System.out.println("<<<<<<<<<<<<<<<<<<上下文监听器结束了>>>>>>>>>>>>>>>>>>>");}}

上一篇:Spring Boot(四)自定义Banner和日志
下一篇:Spring Boot(六)Jar快速运行

  相关解决方案