`

转:filter执行顺序

阅读更多

package anni;
public class EncodingFilter implements Filter {
    public void init(FilterConfig config) throws ServletException {}
    public void destroy() {}
    public void doFilter(ServletRequest request,
            ServletResponse response,
            FilterChain chain)
            throws IOException, ServletException {
        request.setCharacterEncoding("gb2312");
        chain.doFilter(request, response);
    }
}

web.xml中
<filter>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>anni.EncodingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

filter标签部分定义使用的过滤器,filter-mapping标签告诉服务器把哪些请求交给过滤器处理。这里的/*表示所有请求,/表示根路径,*(星号)代表所有请求,加在一起就变成了根路径下的所有请求。这样,所有的请求都会先被EncodingFilter拦截,并在请求里设置上指定的gb2312编码。

================================
用filter控制用户访问权限

我们要保护的页面是admin/index.jsp,为此我们在web.xml进行如下配置。
<filter>
    <filter-name>SecurityFilter</filter-name>
    <filter-class>anni.SecurityFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>SecurityFilter</filter-name>
    <url-pattern>/admin/*</url-pattern>
</filter-mapping>

SecurityFilter过滤器:
public void doFilter(ServletRequest request,
        ServletResponse response,
        FilterChain chain)
        throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;
   HttpSession session = req.getSession();
    if (session.getAttribute("username") != null) {
        chain.doFilter(request, response);
    } else {
        res.sendRedirect("../failure.jsp");
    }
}

首先要将ServletRequest和ServletResponse转换成HttpServletRequest和HttpServletResponse,因为Filter本来设计成为多种协议服务,http协议仅仅是其中一部分。不过我们接触到的也只有http,而且也只有转换成对应HttpServletRequest和HttpServletResponse才能进行下面的session操作和页面重定向。
得到了http请求之后,可以获得请求对应的session,判断session中的username变量是否为null,如果不为null,说明用户已经登录,就可以调用doFilter继续请求访问的资源。如果为null,说明用户还没有登录,禁止用户访问,并使用页面重定向跳转到failure.jsp页面显示提示信息。

==================================
filter所谓的特性

请求映射
filter-mapping和servlet-mapping都是将对应的filter或servlet映射到某个url-pattern上,当客户发起某一请求时,服务器先将此请求与web.xml中定义的所有url-pattern进行匹配,然后执行匹配通过的filter和servlet。

你可以使用三种方式定义url-pattern。
1.直接映射一个请求。
<servlet-mapping>
    <servlet-name>ContactServlet</servlet-name>
    <url-pattern>/contact.do</url-pattern>
</servlet-mapping>
                    
2.映射一个路径下的所有请求。
<servlet-mapping>
    <servlet-name>EncodingFilter</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

3.映射结尾相同的一类请求。
<servlet-mapping>
    <servlet-name>ControllerServlet</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

想要获得所有以user开头.do结尾的请求吗?user*.do在url-pattern是无法识别的,只能配置成*.do,再去servlet中对请求进行筛选。
想要让一个servlet负责多个请求吗?/user/*,/admin/*,*.do写在一起url-pattern也不认识,只能配成多个servlet-mapping。
<servlet-mapping>
    <servlet-name>ControllerServlet</servlet-name>
    <url-pattern>/user/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>ControllerServlet</servlet-name>
    <url-pattern>/admin/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>ControllerServlet</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

过滤链

 

 

服务器会按照web.xml中过滤器定义的先后循序组装成一条链,然后一次执行其中的doFilter()方法。执行的顺序就如上图所示,执行第一个过滤器的chain.doFilter()之前的代码,第二个过滤器的chain.doFilter()之前的代码,请求的资源,第二个过滤器的chain.doFilter()之后的代码,第一个过滤器的chain.doFilter()之后的代码,最后返回响应。
过滤链的好处是,执行过程中任何时候都可以打断,只要不执行chain.doFilter()就不会再执行后面的过滤器和请求的内容。而在实际使用时,就要特别注意过滤链的执行顺序问题,像EncodingFilter就一定要放在所有Filter之前,这样才能确保在使用请求中的数据前设置正确的编码。

filter的详细配置

在servlet-2.3中,Filter会过滤一切请求,包括服务器内部使用forward转发请求和<%@ include file="/index.jsp"%>的情况。
到了servlet-2.4中Filter默认下只拦截外部提交的请求,forward和include这些内部转发都不会被过滤,但是有时候我们需要forward的时候也用到Filter,这样就需要如下配置。
<filter>
    <filter-name>TestFilter</filtername>
    <filter-class>anni.TestFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>TestFilter</filtername>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>EXCEPTION</dispatcher>
</filter-mapping>
        
这样TestFilter就会过滤所有状态下的请求。如果我们没有进行设置,默认使用的就是REQUEST。而EXCEPTION是在isErrorPage="true"的情况下出现的,这个用处不多,看一下即可。
这里FORWARD是解决request.getDispatcher("index.jsp").forward(request, response);无法触发Filter的关键,配置上这个以后再进行forward的时候就可以触发过滤器了。

Filter还有一个有趣的用法,在filter-mapping中我们可以直接指定servlet-mapping,让过滤器只处理一个定义在web.xml中的servlet。
<filter-mapping>
    <filter-name>TestFilter</filter-name>
    <servlet-name>TestServlet</servlet-name>
</filter-mapping>
<servlet>
    <servlet-name>TestServlet</servlet-name>
    <servlet-class>anni.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>TestServlet</servlet-name>
    <url-pattern>/TestServlet</url-pattern>
</servlet-mapping>
       
直接指定servlet-name,TestFilter便会引用TestServlet配置的url-pattern,在某些filter与servlet绑定的情况下不失为一个好办法。

 

 

  • 大小: 14 KB
分享到:
评论

相关推荐

    web.xml 中的listener、 filter、servlet 加载顺序及其详解.doc

    Web.xml 中的 listener、filter、servlet 加载顺序及其详解 在 Web 应用程序中,web.xml 文件扮演着非常重要的角色,它定义了 Web 应用的结构和配置。其中,listener、filter、servlet 是三个非常重要的概念,它们...

    ASP.NET MVC:Filter和Action的执行介绍

    在执行动作方法之前,ActionInvoker会获取过滤器信息,并在必要时按照定义好的顺序调用过滤器方法。 综上所述,*** MVC的Filter和Action是构建Web应用程序的基础组件,它们共同协调,确保应用程序能够高效且灵活地...

    web.xml文件中配置(servlet, spring, filter, listenr)的加载顺序

    ### web.xml文件中配置(servlet, spring, filter, listener)的加载顺序 在Java Web应用开发中,...此外,还应注意`filter-mapping`的顺序对Filter执行的影响,以及如何通过配置Spring Listener来初始化Spring Bean。

    Interceptor与Filter的区别

    - Filter的执行顺序更加固定,而Interceptor的执行顺序更加灵活可控。 - Filter主要用于做一些预处理工作,而Interceptor更多地用于处理与业务逻辑相关的请求拦截需求。 总之,在实际开发过程中,应根据具体的需求...

    java filter 执行过程例子

    过滤链是Filter的执行顺序,先声明的Filter先执行。 3. **请求处理**: - **Chain.doFilter()**:当客户端发起请求时,Servlet容器首先调用第一个Filter的`doFilter()`方法。在这个方法内部,Filter可以选择处理...

    NDIS Filter Drivers指南

    4. **动态配置和插入**:NDIS 使用配置信息来确定 Filter Module 在适配器栈上的排列顺序,并且能够在不完全移除整个驱动程序栈的情况下动态地插入或删除 Filter Module。这种动态性极大地提高了系统的灵活性和适应...

    J2EE之filter的应用

    1. **配置顺序**:在 web.xml 中,Filter 的配置顺序决定了它们的执行顺序。可以通过调整 `&lt;filter-mapping&gt;` 元素的位置来调整 Filter 的优先级。 2. **多个 Filter**:一个请求可以经过多个 Filter,每个 Filter ...

    过滤器、拦截器、AOP、ControllerAdvcie的使用对比、执行顺序及代码教程的示例代码【0积分免费下载】

    过滤器、拦截器、AOP、ControllerAdvcie的使用对比、执行顺序及代码教程的文章内的示例代码,文章...通过文章和这份代码,你可以学到过滤器、拦截器、AOP、ControllerAdvcie的基本使用方式,并了解到他们的执行顺序。

    Filter以及Interceptor的区别

    4. **执行顺序**:多个Filter的执行顺序是由`web.xml`中的配置决定的。 5. **使用场景**:Filter常用于跨域资源共享(CORS)处理、登录验证、编码设置等。 #### 二、Interceptor概述 **Interceptor**(拦截器)是...

    Filter1源代码

    请求会按照配置的顺序依次通过每个Filter的`doFilter()`方法,直到到达目标Servlet。Filter之间是串联的,每个Filter都有机会对请求进行修改或做其他操作。 4. **Filter的实际应用**: - **登录验证**:在用户访问...

    超级注意复杂整合环境中的Filter-Mapping的顺序--配置单点登陆及UrlRewrite有感

    Filter-Mapping则定义了Filter与Servlet之间的关联关系,决定了Filter的执行顺序。在多个Filter存在的情况下,Filter的执行顺序至关重要,因为它可能直接影响到SSO的实现和URL重写的逻辑。 单点登录(SSO)是一种...

    Filter和Listener

    - **执行顺序**:Filter的执行遵循配置顺序,而Listener的执行依赖于事件的发生顺序。 - **应用场景**:Filter更适合用于处理请求的前置和后置操作,如权限检查、编码转换等;而Listener适用于监听和响应Web应用的...

    web.xmllistener、filter、servlet加载顺序.pdf

    你可以通过调整这些标签的位置来控制过滤器的执行顺序。 3. **Servlet(服务程序)** Servlet是实现了`javax.servlet.Servlet`或其子接口的类,它们负责处理HTTP请求和生成响应。在`web.xml`中,Servlet通过`...

    Filter

    2. **Filter链**:多个Filter可以组成一个链,按照注册顺序依次执行。每个Filter完成自己的处理后,将请求传递给下一个Filter,直到达到最终的目标Servlet。 3. **配置Filter**:在Web应用的`web.xml`配置文件中,...

    简单理解Struts2中拦截器与过滤器的区别及执行顺序

    5. 执行顺序:拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。 FilterDispatcher 的四个功能 1. 执行 Actions:FilterDispatcher 通过 ActionMapper 对象来判断是否应该被映射到 Action。 2. 清除 ...

    Java-filter测试程序

    当请求到达时,Filter会按照配置的顺序依次执行,直到请求传递到目标资源。 5. **Filter的实际应用**: - **安全控制**:Filter可以用来检查请求是否携带正确的认证信息,阻止未授权的访问。 - **性能优化**:...

    java 中如何使用filter过滤器

    - **Filter链**:多个Filter可以串联,形成一个链,请求会按顺序通过每个Filter。 - **Filter参数**:在`web.xml`中可以通过`init-param`为Filter提供配置参数,以便在Filter中使用。 - **异步Filter**:Java ...

    JSP_利用Filter解决Servlet输出中文乱码的问题.docx

    7. **Filter的执行顺序**:在`web.xml`中,Filter的配置顺序决定了它们的执行顺序。如果多个Filter映射到同一个URL,那么在`&lt;filter-mapping&gt;`标签内的顺序决定了Filter的执行顺序,先声明的先执行。 通过以上知识...

Global site tag (gtag.js) - Google Analytics