SpringBoot中@WebFilter 过滤器(filter)和拦截器(Interceptor)的使用以及区别

导读:本篇文章讲解 SpringBoot中@WebFilter 过滤器(filter)和拦截器(Interceptor)的使用以及区别,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

在我们的项目当中,只要有登录就必定有过滤器拦截器。过滤器主要针对未登录就访问系统页面时进行过滤非法url,判断用户未登录时跳转到登陆页面,当然深入了可以加上不同用户角色只能访问他们所拥有权限的页面。拦截器主要是对一些非法action请求进行拦截。

过滤器(filter)的使用:

  • 初始化 init(FilterConfig filterConfig)
  • 过滤 doFilter(ServletRequest request, ServletResponse response,FilterChain chain)
  • 销毁 destroy()

@WebFilter(urlPatterns = {“/*”}, filterName = “LogCostFilter”)

 示例代码:

  • urlPatterns 为拦截路径,/* 默认过滤所有(也可过滤html)
  • filterName 指过滤器名字
@WebFilter(urlPatterns = {"/*"}, filterName = "LogCostFilter")
public class LogCostFilter implements Filter {
	 @Override
	 public void init(FilterConfig filterConfig) throws ServletException {
	 }
	 @Override
		public void doFilter(ServletRequest request, ServletResponse response,
				FilterChain chain) throws IOException, ServletException {
			//具体,比如:处理若用户未登录,则跳转到登录页
             if(XXX) {//如果已登录,不阻止
				chain.doFilter(request, response);
				return;
			}else {
            //到登陆页面
                    }
		}
	 @Override
	 public void destroy() {
	 
	 }
	}

除此之外还需在启动类添加注解进行扫描:

@ServletComponentScan(basePackages = {"com.yy.qccrm.filter"})

 

拦截器(Interceptor)的使用

interceptor 的执行顺序大致为:

  1. 请求到达 DispatcherServlet
  2. DispatcherServlet 发送至 Interceptor ,执行 preHandle
  3. 请求达到 Controller
  4. 请求结束后,postHandle 执行

Spring 中主要通过 HandlerInterceptor 接口来实现请求的拦截,实现 HandlerInterceptor 接口需要实现下面三个方法:

示例代码:

  • preHandle() – 在handler执行之前,返回 boolean 值,true 表示继续执行,false 为停止执行并返回。
  • postHandle() – 在handler执行之后, 可以在返回之前对返回的结果进行修改
  • afterCompletion() – 在请求完全结束后调用,可以用来统计请求耗时等等
  public class LoginHandlerIntercepter implements HandlerInterceptor {  
          
        @Override  
        public void afterCompletion(HttpServletRequest request,  
                HttpServletResponse response, Object arg2, Exception arg3)  
                throws Exception {  
        }  
        @Override  
        public void postHandle(HttpServletRequest request, HttpServletResponse response,  
                Object handler, ModelAndView modelAndView) throws Exception {  
        	if(response.getStatus()==404){
                     /404页面....../
            }
        }  
        @Override  
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response,  
                Object arg2) throws Exception {
            HttpSession session = request.getSession();  
            if(!StringUtils.isEmpty(session.getAttribute("user"))){  
                return true;  
            }        else{ 
            	response.sendRedirect("/login");
                return false;  
            }    
        }
    }  

配置类:添加注解@Configuration

示例代码:

  • 编写WebAppConfig类继承WebMvcConfigurerAdapter
  • registry.addInterceptor(new LoginHandlerIntercepter()).addPathPatterns(“/**”).excludePathPatterns(“/login”,”/logins”) 配置拦截路径和排除特殊不拦截
@Configuration
public class WebAppConfig extends WebMvcConfigurerAdapter {
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		// 注册自定义拦截器,添加拦截路径和排除拦截路径
		registry.addInterceptor(new LoginHandlerIntercepter()).addPathPatterns("/**")
				.excludePathPatterns("/login");
	}
}

拦截器和过滤器的区别:

  • 拦截器是基于java反射机制的,过滤器是基于函数回调。
  • 拦截器不依赖于selvet容器,过滤器依赖于servlet容器(使用过滤器,我们需要从spring容器当中取出Bean对象)。
  • 拦截器只能对action请求起作用,过滤器几乎可以对所有请求起作用。
  • 在action生命周期中拦截器可以多次调用,过滤器只能在初始化的时候使用一次

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/115855.html

(0)
Java光头强的头像Java光头强

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!