同花顺
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>
过滤器执行流程
- 用户发送请求。
- 过滤器拦截请求,对请求进行处理。【敲代码的重点】
- 过滤器放行,执行内部servlet资源,进入Controller。【这里执行:filterChain.doFilter(servletRequest,servletResponse)】
- 过滤器拦截响应,对响应进行处理。【基本不会用到,项目中,放行后边基本就没有代码了。】
- 过滤器将结果响应到客户端。
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:结束这一层循环,继续进行判断,继续执行循环体。