Filter

Filter本身和Listener一样,在使用上是非常简单的。就是配置xml(或者注解),然后实现接口即可。所以这里只挑我认为有价值的东西写写。本文不适合从未学习过Filter的朋友,
请先去看:
Filter-黑马程序员
https://www.bilibili.com/video/av48574511/?p=355。

假设现在有一个需求:
我们做了一个web应用,希望用户登录后才能访问一些页面。
你打算怎么做?
JSP:
<%
// 从Session中获取用户信息
Object user = session.getAttribute(“user”);
// 如果user==null,说明用户尚未登录,引导到login.jsp登录
if (user == null) {
response.sendRedirect(request.getContextPath() + “/login.jsp”);
return;
}
%>
这是JSP,本质是个Servlet,也就是可以在jsp里写java判断。

那么,如果是HTML页面,不能在HTML里写java,那怎么办?
我们分析一下,不管这个问题最终要以什么形式解决,都肯定要写Java代码,因为我肯定要去查询Session或者数据库。既然要写Java代码,要和页面请求打交道的话,只能是Servlet或者Controller。我们在Tomcat外传已经了解过,类似HTML这样的静态资源是由DefaultServlet负责读取的(服务器地址由AServlet负责读取,jsp地址由JspServlet负责读取)。
DefaultServlet是Tomcat写的类,我们无法修改它的源码,然后把Session判断等代码加进去。
Servlet已经是目前我们所学技术中离用户请求最近的了,后面的Service、Dao都无法直接和请求打交道。怎么办?
我们只能把这样的代码单独摘出来,放在一个新的对象中(并且为了实现需求,得让它比Servlet离用户的请求更近),而且必须设定一种机制,如果需要,可以强制所有对Servlet/JSP等的请求,都要先经过它。这,就是Filter。


山寨FilterChain(责任链模式):
责任链模式
责任链模式-马士兵
https://www.bilibili.com/video/av50568441

这个程序的难点就是递归的退出时机,以及index++为什么不能和它下面那句代码上下顺序对换(对换执行顺序)。

–190617看文章到目前,java中反射和设计模式是最让我觉得好玩有吸引力的了

不知道大家有没有想过下面两个问题:

为什么执行Servlet之前会经过过滤器?
为什么不修改代码,只修改配置就能新增的Filter,而且仍然保证在Servlet前拦截?
很多初学者其实思维有些固化了,觉得既然是过滤器,肯定就是在Servlet之前执行啊。但我偏要问:为什么?
虽然下面这个解释可能不正确,但有助于大家打破僵化的思维,站在更高的角度,不要老低着头,多抬头看看:
Tomcat应该也有类似Spring的对象管理功能【Me:动态 (没有动态,不是运行中,运行前东西(对象)准备好了)管理(管理的是对象)?类似于动态 代理(如果下定义说代理的是方法)?类似于AOP?】。Tomcat容器初始化时,会把所有Filter对象都注入到FilterChain中,所以再次执行过滤器链,就会经过新增的过滤器(猜测而已)。
而我们自己写的这个代码,如果需要新加一个过滤器,需修改源码,无法扩展(不符合开、闭原则),和Tomcat没法比,。
如果你真的想搞懂责任链模式,应该把代码拷贝到自己的IDEA里,调试一遍。我知道画图画得再多,懒的人照样看不懂。

Filter过滤器、Interceptor拦截器、AOP的执行位置
偷自https://zhuanlan.zhihu.com/p/65335657
由图可知:
1、DispatcherServlet本质还是一个Servlet,而Filter会在Servlet前执行。至于SpringMVC的其他组件,更是在DispatcherServlet之后,所以Filter整体都在SpringMVC之前执行。
2、SpringMVC的拦截器是在SpringMVC各个组件之间起作用的。
3、AOP则是在同一个组件中要执行某个方法时才起作用。

所以,原作者的理解是:
Filter(框架外) > Interceptor(框架内组件间) > AOP(组件内方法间)

最后,提一下Filter的REQUEST、FORWARD、INCLUDE、ERROR,把下面这个视频看懂即可(7分钟):
19javaweb(方立勋) filter开发1
https://www.bilibili.com/video/av9906367/?p=9

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值