经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
springboot(五)过滤器和拦截器
来源:cnblogs  作者:garfieldzf  时间:2018/11/20 10:41:43  对本文有异议

前言

       过滤器和拦截器二者都是AOP编程思想的提现,都能实现诸如权限检查、日志记录等。二者有一定的相似之处,不同的地方在于:

  • Filter是servlet规范,只能用在Web程序中,而拦截器是Spring规范,可以用在Web程序中,也可以用在Application程序中。
  • Filter是servlet中定义的,依赖servlet容器。而拦截器在Spring中定义,依赖Spring容器。
  • 拦截器是一个Spring组件,归Spring管理,配置在Spring的配置文件中,因此它可使用Spring的任何资源。比如Service、数据源等,通过IOC容器注入到拦截器即可,而Filter则不行。
  • Filter只在servlet前后起作用,而拦截器则能深入到方法前后,异常抛出前后。使用深度更大一些。

 

Spring中实现过滤器Filter

方法1:使用springboot提供的 FilterRegistrationBean注册自定义过滤器

  1. public class MyFilter implements Filter {
  2.  
  3. @Override
  4. public void init(FilterConfig filterConfig) throws ServletException {
  5. System.out.println("MyFilter init...");
  6. }
  7.  
  8. @Override
  9. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  10. //站点图标/favicon.ico filter会执行2次
  11. HttpServletRequest request=(HttpServletRequest) servletRequest;
  12. System.out.println(request.getRequestURI());
  13. System.out.println("MyFilter dofilter...");
  14. filterChain.doFilter(servletRequest,servletResponse);
  15. }
  16.  
  17. @Override
  18. public void destroy() {
  19.  
  20. }
  21. }

 在springboot中注册Filter

  1. @Configuration
  2. public class FilterConfig {
  3.  
  4. @Bean
  5. public FilterRegistrationBean registrationBean(){
  6. FilterRegistrationBean myfilter=new FilterRegistrationBean(new MyFilter());
  7. myfilter.addUrlPatterns("/*");
  8.  
  9. return myfilter;
  10. }

   到这里运行demo时会发现do filter执行了2次,debug发现这是因为浏览器请求时站点图标管理,通过uri能发现。可以根据自己的需求用正则表达式适当控制。

 

方法2:servlet注解定义Filter

  1. @Component
  2. @WebFilter(filterName = "myFilter2",urlPatterns = "/*")
  3. public class MyFilter2 implements Filter {
  4. @Override
  5. public void init(FilterConfig filterConfig) throws ServletException {
  6. System.out.println("myFilter2 init...");
  7. }
  8.  
  9. @Override
  10. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  11. System.out.println("myFilter2 dofilter ...");
  12. filterChain.doFilter(servletRequest,servletResponse);
  13. }
  14.  
  15. @Override
  16. public void destroy() {
  17.  
  18. }
  19. }

 运行结果

 

 使用servleta注解声明的filter,执行时只有一次请求。和使用spring配置filter这里不同。

 

Spring中实现拦截器

    拦截器主要使用自定义类集成HandlerInterceptor。preHandle返回true时程序才会继续向下执行,返回false则中断请求。

  1. public class MyInterceptor implements HandlerInterceptor {
  2.  
  3. @Override
  4. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  5. System.out.println("/preHandler");
  6. return true;
  7. }
  8.  
  9. @Override
  10. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView)
    throws Exception {
  11. System.out.println("postHandler");
  12. }
  13.  
  14. @Override
  15. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
  16. System.out.println("afterCompletion");
  17. }
  18. }

 在程序中配置拦截器并声明拦截规则

  1. @Configuration
  2. public class InterceptorConfig implements WebMvcConfigurer {
  3.  
  4. @Override
  5. public void addInterceptors(InterceptorRegistry registry) {
  6. registry.addInterceptor(new MyInterceptor()).addPathPatterns("/*");
  7. }
  8. }

 运行结果

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号