Spring Boot(五) filter/interceptor/listener

当使用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 stub
    LOGGER.info("<<<<<<<<<<<<<<<<<<<<<过滤器处理中>>>>>>>>>>>>>>>>>>>>>>>>");
    chain.doFilter(request, response);
}

@Override
public void init(FilterConfig arg0) throws ServletException {
    // TODO Auto-generated method stub
    LOGGER.info("\"<<<<<<<<<<<<<<<<<<<<<过滤器开始了>>>>>>>>>>>>>>>>>>>>>>>>\"");
}

@Override
public void destroy() {
    // TODO Auto-generated method stub
    LOGGER.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快速运行

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿呆编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值