[有书共读]JavaWeb高级编程

JavaWeb高级编程 -- 篇9

使用过滤器改进应用程序

过滤器是可以拦***问资源的请求、资源的响应或者同时拦截两者的应用组件。
过滤器可以检测和修改请求和响应,它们甚至可以拒绝、重定向或转发请求。
过滤器在初始化时将调用init方法,它可以访问过滤器的配置、初始化参数和SevletContext,正如Servlet的init方法一样。当请求进入过滤器中时,doFilter方法将会被调用,它提供了对ServletRequest、ServletResponse和FilterChain对象的访问。在doFilter之中,可以拒绝请求或者调用FilterChain对象的doFilter方法,可以修改请求和响应,并且可以封装请求和响应对象。
尽管只有一个Servlet可以处理请求,但可以使用许多过滤器拦截请求。
如同Servlet一样,过滤器可以被映射到URL模式,这会决定哪个过滤器将拦截某个请求。在任何匹配某个过滤器的URL模式的请求在被匹配的Servlet处理之前将首先进入该过滤器。
在声明和映射过滤器拦截请求之前,必须如同Servlet一样声明和映射它们。传统的方式是在部署描述符中使用和元素。必须至少包含一个名字和类名,它还可以包含描述、显示名称、图标以及一个或多个初始化参数。


 myFilter
    com.wrox.MyFilter

与Servlet不同的是,过滤器不可以在第一个请求到达时加载。过滤器的init方法总是在应用程序启动时调用。
在声明了过滤器之后,可以将它映射到任意数目的URL或Servlet名称。


 myFilter
    /foo
    /bar/*
    myServlet
    REQUEST
    ASYNC

过滤器将会响应所有相对于应用程序的URL/foo和/bar/*的请求,以及任何最终由Servlet/myServlet处理的请求。这里的两个元素意味着它可以响应普通的请求和由AsyncContext派发的请求。有效的类型有:REQUEST、FORWARD、INCLUDE、ERROR和ASYNC。

如同Servlet一样,可以注解声明和映射过滤器。

@WebFilter(
 filterName = "myFilter",
    urlPatterns = { "/foo","/bar/*" },
    servletNames = { "myServlet" },
    dispatcher = { DispatcherType.REQUEST, DispatcherType.ASYNC }
)
public class MyFilter implements Filter{
 ...
}

使用注解声明和映射过滤器的主要缺点是:不能对过滤器链上的过滤器进行排序。如果希望在不使用部署描述符的情况下控制过滤器的执行顺序,那么需要使用编程式配置。

如同Servlet、***和其他组件一样,可以在ServletContext中以编程的方式配置过滤器。不使用部署描述符和注解,调用ServletContext的方法注册和映射过滤器即可。因为这必须要在ServletContext结束之前完成,所有通常需要在ServletContextListener的contextInitialized方法中也实现。
过滤器顺序决定了过滤器在过滤器链中出现的位置,这反过来也决定了过滤器什么时候处理请求。
使用注解时无法对过滤器进行排序。
定义过滤器顺序是很简单的:匹配请求的过滤器将按照它们出现在部署描述符或者编程式配置中的顺序添加到过滤器链中。不同的请求将匹配不同的过滤器,但使用的过滤器顺序总是相同的。URL映射的过滤器优先级比Servlet名称映射到的过滤器高。如果两个过滤器都可以匹配某个请求,一个是URL模式而另一个是Servlet名称,那么在过滤器链中,由URL模式匹配的过滤器总是出现由Servlet名称匹配的过滤器之前。

如果使用AsyncContext直接处理响应对象,代码将在所有过滤器的范围之外执行。不过,如果使用AsyncContext的dispatch方法在内部将请求转发到某个URL,那么映射到ASYNC请求的过滤器可以拦截该内部转发请求,并应用必要的额外逻辑。

#Java##读书笔记#
全部评论

相关推荐

notbeentak...:真的nc,算毕业6月份,要给这种b公司打半年多白工😅
点赞 评论 收藏
分享
emmm别问我为啥上一条帖子隔了两个月我才开始投简历和拿offer,因为我懒😰简单流程如下:周一凌晨改好的简历,然后到处乱投简历;周二接到了三维家的一面通知,临时抱佛脚的背了一些八股;周三上午一面下午通知第二天hr面;周四上午hr面下午拿offer,遂收手支线:在BOSS上顺手投了几个大厂,投字节的时候不小心投城客户端了,结果过了一天HR突然把我简历要走了,还问我能不能整客户端,我直接一口答应(脏面评警告😢)结果在周三下午的时候给我打电话,说前端有空缺实习岗,问我有没有兴趣,然后就跟我约了周四下午一面😰我都没咋准备啊,咩都不会啊😭结果周四下午面完,晚上打电话通知过一面了,赶紧把二面约在下周一下午,留点缓冲时间。逆大天了,我一半的问题都不会,他居然给我过了?运气未免有点好了😥现在正在恶补计网、网安、性能优化的东西(这三大板块我是几乎一点不会,一面几乎一点答不出来,加上我又没怎么背八股,这块被干烂了😵)心得体会与经验:1. 我giao怎么这么快就结束了,我还以为要找好久😨2. 大厂的面试问题真的和中厂小厂很大不同,比如在三维家我能自己吹水到vue的数据劫持、Proxy代理响应式之类的他们就觉得很不错了,但是在字节你但凡敢提到一下就会追问你细节了,一追问马脚就全漏出来了3. 有信心真的很重要,我感觉我能拿中厂offer最重要的就是吹水吹出自信来了,以至于三维家面试反问面试官有哪里还需要改进的时候,他就说很不错了解的很多😦4. 理解很重要,我从头到尾真没背过很多八股,不过有一些知识确实是敲过代码验证过,所以面试的时候能吹水吹得出来😇想了解面经啥的可以直接评论区问我,但我可能也说不全,因为我没有记录,而且今天摆了一天感觉记忆快清空了😵下面是故事时间:我暑假刚开始的时候才开始准备八股,印象很深那个时候连什么原型、事件循环、闭包这些名词都没听过,资料也不知道怎么找,就一直零零散散的准备,感觉也只有js稍微背了一下八股,其他很多时候都是靠完全理解和手写熟悉一些机制的,但这样做效率很低,反正准备了一个多星期半个月就开摆了😭结果一摆就摆到了开学,笔记是乱七八糟的,八股是忘光光的,简历是一直没改的,实习也是一直没投过的。直到上周日晚上偶然和师兄聊天,他突然问我“你怎么还不找实习”,那天晚上才幡然醒悟,是时候做点事情了😡然后就按照上面描述的来走了。其实我感觉我从头到尾都没背特别多八股,也没怎么找刷题资料啥的,早期就是翻尚硅谷或者黑马的入门视频从头学起,中期用面试鸭看了一点点题,主要是在学js机制和敲js代码,后期才发现了w3c的面经网站,然后在那里看着学(那个时候已经懒得敲了,因为有些问题与代码感觉不像是给找实习的看的,忒细了点😂)接下来继续准备字节二面吧,虽然几乎没啥可能可以通过,但是万一有奇迹呢?😍😍😍也祝大家能够早日拿到心仪的offer
我的offer呢😡:我已经预见10天后你会发,节孝子启动了
投递三维家等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务