博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaWeb过滤器
阅读量:4664 次
发布时间:2019-06-09

本文共 4780 字,大约阅读时间需要 15 分钟。

序言:从今天开始慢慢复习Java基础

 

一:过滤器的简介

1.1 过滤器是什么

1:过滤器是javaweb中的三大组件之一,也就是说需要在web.xml中配置,也可以使用注解。

2:过滤器它能够对Servlet容器传给web组件中的ServletRequest和ServletResponse对象进行检查或者修改。比如过滤器能够在Web组件被调用之前检查ServletRequest对象,修改请求头或者请求的正文;过滤器能够在被Web组件调用之后检查ServletResponse对象,修改响应头或者响应的内容。

3:过滤器就像我们现实中的在窗户装一个过滤网,这样可以避免有蚊子进来,那么如果让蚊子进来呢?将那个过滤网的洞口变大一点,那么蚊子就可以进来了。

4:过滤器它会在一组资源(jsp、servlet、.css、.html等等)的前面执行, 它可以让请求得到目标资源,也可以不让请求达到。

 

1.2 使用过滤器的好处

 

A:通过一个现实的例子:在没有使用过滤器之前,我举例生活中的一个例子,比如 某某公司,分配了好多个部门,每个部门门口前面都有一个保安来检查你是不是该公司的人,如果是,那么你就可以进去。 如果我们使用这种方式的话,那么一个公司就得多请几个保安,这样导致总是重复一些劳动,降低了保安的检查工作的效率。

那么如果我们使用过滤器的话,就好比你在公司的大门面前,安排一个保安来检查是否是该公司的人,如果是,就放他进该公司,这样会大大提高保安的工作效率,而且还能减少重复劳动力,只需要请一个保安。

B:当多个web组件中编写同样操作的代码,那么我们可以将各个组件的相同操作可以放在同个过滤器中来完成,从而提高开发的效率。

二: Filter的API

void init(FilterConfig)  * 创建之后,马上执行;Filter会在服务器启动时就创建!void destory()  * 销毁之前执行!在服务器关闭时销毁void doFilter(ServletRequest,ServletResponse,FilterChain)  * 每次过滤时都会执行二个对象:FilterConfig(这个对象就类似当初学ServletConfig的时候)getInitparamer*获取初始化参数getFilterName*获取配置名称getServletContext*获取配置的值FilterChain(这个东西比较重要)*doFilter作用:这个东西其实就决定了整个Filter,该方法决定了是否放行下一个过滤器执行(如果没有过滤器的话,那么执行目标资源)。

 

三:过滤器快速入门

3.1步骤

3.1.1 实现Filter接口

因为Filter不是ServletRequest或者ServletResponse中的对象,所以我们只需要直接用java的方式实现Filter接口

3.1.2 部署web.xml

这个东西的部署跟Servlet的部署是一样的,只是把将Servle的名字改为Filter

 
类名
类名
包名.类名
包名.类名
类名
类名
/类名
拦截的资源
REQUEST
默认的!还有三个 值FORWARD,INCLUDE,ERROR
View Code

 

3.1.3  快速入门案例代码

1   
2
AServlet
类名
3
cn.itcast.web.AServlet.AServlet
包名.类名
4
5
6
AServlet
类名
7
/AServlet
拦截的资源
8
REQUEST
默认的!还有三个 值FORWARD,INCLUDE,ERROR9
View Code

 

效果图:

四:Filter执行顺序

前面我们说过,FilterChain中有个方法(doFilter)及其重要,它能够决定整个doFilter,因为它能够决定你是否能够执行下一个过滤器(如果没有过滤器的话,那么直接执行目标资源)。

那么问题来了,当有多个过滤器的话,那么Filter的执行顺序是怎么样的?

4.1  多个过滤器执行顺序

当一个目标有多个过滤器执行顺序的时候,那么他的执行顺序是根据xml的中的位置,来执行过滤器的,

那么如果当中有涉及到放行呢? 那么流程可以这样记 当你去姥姥家取水果的时候,会先经过匪徒A再经过匪徒B,如果当你去的时候,他们会放你过去 那么会经过AB,回来的就从先经过B再经过A。

 

public class MyFilter1 extends HttpFilter {    public void doFilter(HttpServletRequest request, HttpServletResponse response,           FilterChain chain) throws IOException, ServletException {       System.out.println("filter1 start...");       chain.doFilter(request, response);//放行,执行MyFilter2的doFilter()方法       System.out.println("filter1 end...");    }}public class MyFilter2 extends HttpFilter {    public void doFilter(HttpServletRequest request, HttpServletResponse response,           FilterChain chain) throws IOException, ServletException {       System.out.println("filter2 start...");       chain.doFilter(request, response);//放行,执行目标资源       System.out.println("filter2 end...");    }}      This is my JSP page.     

index.jsp

<%System.out.println("index.jsp"); %> 当用户访问index.jsp的时候,输出的结果:filter1 start...filter2 start...index.jspfilter2 end...filter1 end...
View Code

五:Filter 拦截方式

附上 dispatcher 的可选值及说明

可选值
说明
REQUEST
当客户端直接请求时,通过过滤器进行处理
INCLUDE
当客户端通过 RequestDispatcher 对象的 include() 方法请求时,通过过滤器处理
FORWARD
当客户端通过 RequestDispatcher 对象的 forward() 方法请求时,通过过滤器进行处理
ERROR
当声明式异常产生时,通过过滤器进行处理
 

六:过滤器的应用场景

过滤器的应用场景:

* 执行目标资源之前做预处理工作,例如设置编码,这种试通常都会放行,只是在目标资源执行之前做一些准备工作;

* 通过条件判断是否放行,例如校验当前用户是否已经登录,或者用户IP是否已经被禁用;

* 在目标资源执行后,做一些后续的特殊处理工作,例如把目标资源输出的数据进行处理;

 
 

转载于:https://www.cnblogs.com/Yzengxin/p/11204486.html

你可能感兴趣的文章
jsp的九个内置对象
查看>>
(简单) HUST 1017 Exact cover , DLX+精确覆盖。
查看>>
python 多进程和子进程1
查看>>
android--多View切换viewpager
查看>>
工厂方法模式(Factory Method)
查看>>
淘宝网发展史:揭开神秘组织的技术内幕与艰辛历程
查看>>
System.setOut 重定向 memcached 的输出
查看>>
[JLOI2012]时间流逝
查看>>
Fibonacci
查看>>
复数模版
查看>>
LINUX netlink机制
查看>>
memmove 和 memcpy的区别以及处理内存重叠问题
查看>>
Windows Mobile 串口通信之串口打开
查看>>
HDU4707:Pet(DFS)
查看>>
2012年敏捷个人俱乐部(北京)实践团开始报名了......
查看>>
MySQL 索引方式
查看>>
Linux磁盘及文件系统(一)
查看>>
scala Spark MLlib实现的中文文本分类–Naive Bayes
查看>>
django进阶
查看>>
Phalcon处理404页面的 Ruter 方法
查看>>