过滤器与拦截器的区别

同花顺

web项目有三个组件。

servlet是顶梁柱。

filter是扛把子。

listener是买东西送的。

今天介绍filter。

过滤器原理

过滤器,简单来说,在你的请求到达内部资源Controller之前,拦截住你的请求,进行特殊处理,或者判断是否符合我们的要求,然后执行放行操作。

过滤器很像生活中的净水器,高铁安检,顾名思义。

起到过滤作用和增强作用

符合我们规则的才让你走,你走的时候,我还可以加点料,比如处理一下字符编码,敏感字符替换成星星你个星星。

图片来源:https://www.cnblogs.com/panxuejun/p/7715917.html

在这里插入图片描述

过滤器常用操作

1、Shiro与SpringSecurity等安全框架。(系统安全问题)

2、登录校验。(判断是否登录)

3、敏感字符过滤。(王者中的***)

4、统一网站编码。(乱码处理)

5、软件安全。(解决xss与crsf攻击)

过滤器使用方式

1、自定义过滤器类,实现Filter接口。

public class laoFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {

}

// 在这个方法中拦截,并进行你想要的特殊处理
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    System.out.println("过滤器拦截了");
    //执行放行操作,让你过去,执行你的controller去吧。
    filterChain.doFilter(servletRequest, servletResponse);
}

@Override
public void destroy() {

}

}

2、重写doFilter抽象方法,实现拦截。

3、修改web.xml。

   //加入spring容器,告诉tomcat,我在。
   <filter>
         <filter-name>laoFilter</filter-name>
         <filter-class>com.laoben.laoFilter</filter-class>
   </filter>
    //这个过滤器要保护哪些资源,就在url-pattern中定义。
   <filter-mapping>
        <filter-name>laoFilter</filter-name>
        <url-pattern>/sel/*</url-pattern>
    </filter-mapping>

过滤器执行流程

  1. 用户发送请求。
  2. 过滤器拦截请求,对请求进行处理。【敲代码的重点】
  3. 过滤器放行,执行内部servlet资源,进入Controller。【这里执行:filterChain.doFilter(servletRequest,servletResponse)
  4. 过滤器拦截响应,对响应进行处理。【基本不会用到,项目中,放行后边基本就没有代码了。】
  5. 过滤器将结果响应到客户端。

	System.out.println("过滤器拦截请求。");

​	filterChain.doFilter(servletRequest,servletResponse);

​	System.out.println("过滤器拦截响应。");

拦截器的思想

AOP ,面向切面编程。

与动态代理相似。

过滤器与拦截器的工作流程

请求到来,过滤器判断是否符合相应规则。

符合规则,放行。

请求进入拦截器,进行前期的数据验证处理,放行。

请求进入接口,进行业务处理,通过。

请求进入拦截器,进行后期的业务判断,放行。

请求原路返回到过滤器,进行方法后操作。完成。

过滤器与拦截器的区别

a、过滤器不可以使用IOC中的bean进行业务处理,拦截器可以。因为拦截器是被Spring容器管理的。

b、深度不同,过滤器只在servlet前后起作用,拦截器深入controller方法前后,异常抛出前后。

c、通过参数来区分,ServletRequest是过滤器,HttpServletRequest是拦截器(不准确,两个是可以转换的)。

d、拦截器中的方法是preHandle,postHandle,afterCompletion,过滤器中的方法是doFilter

break、return、continue

过滤器放行后,我们经常可以看到return关键字,为什么不适用break呢?

return:结束当前方法体,返回至调用该方法中。

break:结束当前循环,不进行任何判断,执行循环体后下边内容。

continue:结束这一层循环,继续进行判断,继续执行循环体。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值