过滤器详细
5 四种拦截方式

我们来做个测试,写一个过滤器,指定过滤的资源为b.jsp,然后我们在浏览器中直接访问b.jsp,你会发现过滤器执行了!

但是,当我们在a.jsp中request.getRequestDispathcer(“/b.jsp”).forward(request,response)时,就不会再执行过滤器了!也就是说,默认情况下,只能直接访问目标资源才会执行过滤器,而forward执行目标资源,不会执行过滤器!(跳转的不会执行F)

public class MyFilter extends HttpFilter {
public void doFilter(HttpServletRequest request,
HttpServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("myfilter...");
chain.doFilter(request, response);
}
}
<filter>
<filter-name>myfilter</filter-name>
<filter-class>cn.itcast.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myfilter</filter-name>
<url-pattern>/b.jsp</url-pattern>
</filter-mapping>
<body>
<h1>b.jsp</h1>
</body>
<h1>a.jsp</h1>
<%
request.getRequestDispatcher("/b.jsp").forward(request, response);
%>
</body>

http://localhost:8080/filtertest/b.jsp -->直接访问b.jsp时,会执行过滤器内容;

http://localhost:8080/filtertest/a.jsp --> 访问a.jsp,但a.jsp会forward到b.jsp,这时就不会执行过滤器!

其实过滤器有四种拦截方式!分别是:REQUEST、FORWARD、INCLUDE、ERROR。

l  REQUEST:直接访问目标资源时执行过滤器。包括:在地址栏中直接访问、表单提交、超链接、重定向,只要在地址栏中可以看到目标资源的路径,就是REQUEST;

l  FORWARD:转发访问执行过滤器。包括RequestDispatcher#forward()方法、<jsp:forward>标签都是转发访问;

l  INCLUDE:包含访问执行过滤器。包括RequestDispatcher#include()方法、<jsp:include>标签都是包含访问;

l  ERROR:当目标资源在web.xml中配置为<error-page>中时,并且真的出现了异常,转发到目标资源时,会执行过滤器。

可以在<filter-mapping>中添加0~n个<dispatcher>子元素,来说明当前访问的拦截方式。

<filter-mapping>

<filter-name>myfilter</filter-name>

<url-pattern>/b.jsp</url-pattern>

<dispatcher>REQUEST</dispatcher>[崔1]

<dispatcher>FORWARD</dispatcher>[崔2]

</filter-mapping>

<filter-mapping>

<filter-name>myfilter</filter-name>

<url-pattern>/b.jsp</url-pattern>

</filter-mapping>[崔3]

<filter-mapping>

<filter-name>myfilter</filter-name>

<url-pattern>/b.jsp</url-pattern>

<dispatcher>FORWARD</dispatcher>[崔4]

</filter-mapping>

[崔1]b.jsp为目标资源,当直接请求b.jsp时,会执行过滤器

[崔2]当转发到b.jsp页面时,会执行过滤器(这种申明了就可以转发的也执行过滤器

[崔3]当没有给出拦截方式时,那么默认为REQUEST

[崔4]当转发到b.jsp页面时,会执行过滤器!因为已经给出了<dispatcher>FORWARD</dispatcher>了,那么就没有默认的REQUEST了!所以只有在转发到b.jsp时才会执行过滤,而转发到b.jsp时,不会执行b.jsp

其实最为常用的就是REQUEST和FORWARD两种拦截方式,而INCLUDE和ERROR都比较少用!其中INCLUDE比较好理解,我们这里不再给出代码,可以通过FORWARD方式修改,来自己测试。而ERROR方式不易理解,下面给出ERROR拦截方式的例子:

<filter-mapping>

<filter-name>myfilter</filter-name>

<url-pattern>/b.jsp</url-pattern>

<dispatcher>ERROR</dispatcher>[崔5]

</filter-mapping>

<error-page>

<error-code>500</error-code>

<location>/b.jsp</location>[崔6]

</error-page>

<body>

<h1>a.jsp</h1>

<%

if(true)

throw new RuntimeException("嘻嘻~");[崔7]

%>

</body>

[崔5]拦截方式为ERROR

[崔6]把b.jsp执行为500的错误页面

[崔7]当用户访问a.jsp页面时会抛出异常,即500了!

这时服务器会转发到b.jsp,在这之前会执行过滤器!

6 过滤器的应用场景

过滤器的应用场景:

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

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

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

[c8]几乎是的Sevlet中都需要写request.setCharacterEndoing() 可以把它入到一个Filter中(中文乱码必须添加,因为架构后面影藏了一些编码分方式,只能在过滤器中去声明)

[c9]回程拦截!

7 设置目标资源

在web.xml文件中部署Filter时,可以通过“*”来执行目标资源:

<filter-mapping>

<filter-name>myfilter</filter-name>

<url-pattern>/*</url-pattern>[崔10]

</filter-mapping>

这一特性与Servlet完全相同!通过这一特性,我们可以在用户访问敏感资源时,执行过滤器,例如:<url-pattern>/admin/*<url-pattern>,可以把所有管理员才能访问的资源放到/admin路径下,这时可以通过过滤器来校验用户身份。

还可以为<filter-mapping>指定目标资源为某个Servlet,例如:

<servlet>

<servlet-name>myservlet</servlet-name>

<servlet-class>cn.itcast.servlet.MyServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>myservlet</servlet-name>

<url-pattern>/abc</url-pattern>

</servlet-mapping>

<filter>

<filter-name>myfilter</filter-name>

<filter-class>cn.itcast.filter.MyFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>myfilter</filter-name>

<servlet-name>myservlet</servlet-name>[崔11]

</filter-mapping>

  当用户访问http://localhost:8080/filtertest/abc时,会执行名字为myservlet的Servlet,这时会执行过滤器。

[崔10]表示过滤所有资源

[崔11]这里没有指定<url-pattern>,而是指定<servlet-name>!注意,它与某个Servlet的配置名称相同!

学习笔记_过滤器详细_2(过滤器JavaWeb三大组件之一)的更多相关文章

  1. 学习笔记_过滤器概述(过滤器JavaWeb三大组件之一)

    过滤器Filter Filter和Lister是Servlet规范里的两个高级特性.不同于Servlet,它们不用于处理客户端请求,只用于对request.response进行修改或者对context ...

  2. Javaweb学习笔记——(二十一)——————过滤器

    过滤器     过滤器概述         1.什么是过滤器:             过滤器javaweb三大组件之一,它与Serlvet很相似,不过它过滤器是用来拦截请求的,而不是处理       ...

  3. Linux 学习笔记之超详细基础linux命令(the end)

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 14---------------- ...

  4. Linux 学习笔记之超详细基础linux命令 Part 14

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 13---------------- ...

  5. Linux 学习笔记之超详细基础linux命令 Part 13

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 12---------------- ...

  6. Linux 学习笔记之超详细基础linux命令 Part 12

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 11---------------- ...

  7. Linux 学习笔记之超详细基础linux命令 Part 11

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 10---------------- ...

  8. Linux 学习笔记之超详细基础linux命令 Part 10

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 9----------------- ...

  9. Linux 学习笔记之超详细基础linux命令 Part 9

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 8----------------- ...

  10. Linux 学习笔记之超详细基础linux命令 Part 8

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 7----------------- ...

随机推荐

  1. Maven详解 之 聚合与继承

    说到聚合与继承我们都很熟悉,maven同样也具备这样的设计原则,下面我们来看一下Maven的pom如何进行聚合与继承的配置实现. 一.为什么要聚合? 随着技术的飞速发展和各类用户对软件的要求越来越高, ...

  2. SharePoint 2010 修改默认列表样式

    SharePoint 2010  修改默认列表样式 :可以通过修改 下面两个全局配置进行修改.(未完..更新中...)  C:\Program Files\Common Files\Microsoft ...

  3. 2014年Tizen开发者峰会上海征稿启事!

    本次征稿面向大中华用户: “Tizen开发者,应用程序开发人员.isv平台设计师.运营商.厂商.硬件厂商.软件厂商,开源爱好者,和从事Tizen的工作人员” 2014年Tizen开发者峰会 这一次,亚 ...

  4. cygwin设置中文

    cygwin\home\username\.bashrc # 让ls和dir命令显示中文和颜色 alias ls='ls --show-control-chars --color' alias dir ...

  5. Excel中VBA 连接 数据库 方法- 摘自网络

    Sub GetData() Dim strConn As String, strSQL As String Dim conn As ADODB.Connection Dim ds As ADODB.R ...

  6. poj1515--Street Directions(边的双连通)

    给一个无向图,要求变成强连通的有向图,需要保留哪些边. 边的双连通,对于桥保留两条边,其他的只保留一条边.求双连通的过程中记录保留边. /******************************* ...

  7. ADODB.Connection 错误 '800a0e7a' 未找到提供程序 该程序可能未正确安装

    今天调程序的时候发现的,错误提示如下: ADODB.Connection 错误 '800a0e7a' 未找到提供程序.该程序可能未正确安装. /conn.asp,行 6 因为系统是64位的win7或w ...

  8. ehcharts中国地图四级级下钻

    echarts 官网关于中国地图,只有全国-省:省-市,没有中国-省-市-县四级下钻相关文献,echarts地图最重要一点是模块化相对于其他各个图形,一下为三级下钻部分代码包括各级别交互,望指点: 中 ...

  9. 【DB】HBase的基本概念

    一 Hbase是个啥东东?  在说Hase是个啥家伙之前,首先我们来看看两个概念.面向行存储和面向列存储.面向行存储.我相信大伙儿应该都清楚,我们熟悉的RDBMS就是此种类型的.面向行存储的数据库主要 ...

  10. android开发Proguard混淆与反射

    http://charles-tanchao.diandian.com/post/2012-05-24/20118715 由于前面开发数据操作类,所以利用反射,封装了一个BaseDao,本来在平常的时 ...