学习笔记_过滤器详细_2(过滤器JavaWeb三大组件之一)

过滤器详细
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的配置名称相同!

时间: 2024-08-05 23:16:18

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

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

过滤器Filter Filter和Lister是Servlet规范里的两个高级特性.不同于Servlet,它们不用于处理客户端请求,只用于对request.response进行修改或者对context.session.request事件进行监听. Filter意为滤镜或者过滤器,用于Servlet之外对request或者response进行修改.Filter提出了滤镜链的概念,一个Filterchain包括多个F 1 什么是过滤器 过滤器JavaWeb三大组件之一,它与Servlet很相似!不它

Servlet学习笔记(八)—— 自定义过滤器的编写改进:自定义实现FilterChain

笔记六中实现了三种过滤器:字符编码过滤.登录权限过滤.敏感词过滤,但是有个缺陷就是,限定了过滤顺序,而不能实现先进行request过滤,最后response过滤,并且中间几项过滤的顺序不能动态改变.所以这里做个改进,实现一个过滤顺序的FilterChain. 多个Filter的执行顺序在这篇博文中得到很仔细的讲解,总结一点,多个过滤器的执行顺序是根据web.xml中不同<filter-mapping>的顺序来先后执行的,比如: <?xml version="1.0"

Servlet学习笔记(六)—— 自定义过滤器的编写

Boss今天让我写一个类似BBS留言板的过滤器,要求对字符编码.登录权限.敏感词进行过滤操作. 总体分两模块: 一.过滤器 //Filter.java package lewa; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public interface Filter { public void init(); public void doFilter(ServletRequest reu

九、Android学习笔记_ Android开发中使用软引用和弱引用防止内存溢出

在<Effective Java 2nd Edition>中,第6条"消除过期的对象引用"提到,虽然Java有 垃圾回收机制,但是只要是自己管理的内存,就应该警惕内存泄露的问题,例如的对象池.缓存中的过期对象都有可能引发内存泄露的问题.书中还提到可以用 WeakHashMap来作为缓存的容器可以有效解决这一问题.之前也确实遇到过类似问题,但是没有接触过"弱引用"相关的问题,于是查阅了一些资料. <Java 理论与实践: 用弱引用堵住内存泄漏>

十五、Android学习笔记_授权过程

1.需要申请App Key和App Secret.不同的开发平台有不同的接入方式,可以参考文档,然后将这两个值放进去. 2.通过OAuth类实现认证,它会自动跳转到认证界面,进行授权,成功之后需要处理回调接口. 3.在第二步调用回调接口时,它会返回用户的基本信息,比如用户id.此时需要将用户id信息保存起来,为后面登录做准备.回调接口的写法就为myapp://AuthorizeActivity,其中scheme全部为小写字母. <activity android:name="com.wei

JavaWeb三大组件—过滤器filter

JavaWeb三大组件 1. 都需要在web.xml中进行配置ServletListener(2个感知监听器不需要配置)Filter 2. 过滤器 它会在一组资源(jsp.servlet..css..html等等)的前面执行! 它可以让请求得到目标资源,也可以不让请求达到! * 过滤器有拦截请求的能力! 登录:允许它访问AServlet.BServlet.CServlet ------------------------------- 过滤器如何编写 1. 写一个类实现Filter接口2. 在w

Unity3d_学习笔记_入门

转自:http://blog.csdn.net/zlfxy/article/details/8722437 本文内容来自“编程教父”的视频课程. 1.Unity3d一个游戏引擎,可以用来开发很多游戏. 要利用Unity3d开发游戏,我们首先要下载一个Unity3d软件.下载后,下载一个破解补丁,这样就可以正常进行开发了. 2.Unity3d每次只能开启一个工程项目. (1)Unity3d中比较重要的一个对象就是摄像机了,摄像机就相当于我们人的眼睛,有了摄像机,运行程序后,才能够有视野. (2)U

JavaWeb三大组件小结

学完JavaWeb阶段有一段时间了,在进入框架学习之前,把JavaWeb三大组件做个总结记录,为框架学习铺点基础. 一.什么是JavaWeb三大组件? Servlet,Listener,Filter.它们在JavaWeb开发中分别提供不同的功能. 二.三大组件介绍 1.Servlet 1.1 servlet介绍 广义上说,servlet是运行在web服务器或应用服务器的程序,用来处理客户端请求的动态资源.Servlet = Service + Applet,表示小服务程序.狭义上来说,狭义的Se

javaweb三大组件

学完JavaWeb阶段有一段时间了,在进入框架学习之前,把JavaWeb三大组件做个总结记录,为框架学习铺点基础. 一.什么是JavaWeb三大组件? Servlet,Listener,Filter.它们在JavaWeb开发中分别提供不同的功能. 二.三大组件介绍 1.Servlet 1.1 servlet介绍 广义上说,servlet是运行在web服务器或应用服务器的程序,用来处理客户端请求的动态资源.Servlet = Service + Applet,表示小服务程序.狭义上来说,狭义的Se

javaweb三大组件之servlet(转载)

javaWeb有三大组件:Filter.Servlet.Listener jsp有九大内置对象:application.session.request.response.out.page.pagecontent.config.exception javaEE三大组件技术: Servlet,JSP,EJB Servlet(Server Applet),全称Java Servlet,未有中文译文.是用Java编写的服务器端程序.其主要功能在于交互式地浏览和修改数据,生成动态Web内容.狭义的Serv