Filter的执行顺序

一、 过滤器不仅能处理请求还能处理响应

二、测试Filter的执行顺序

  2.1.先写一个EncodingFilter

package org.burning.sport.filter;
import javax.servlet.*;
import java.io.IOException;

public class EncodingFilter implements Filter{
    private String encoding;
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("init EncodingFilter.......");
        encoding = filterConfig.getInitParameter("encoding");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("before EncodingFilter doFilter.....");
        request.setCharacterEncoding(encoding);
        chain.doFilter(request, response);
        System.out.println("after EncodingFilter doFilter......");
    }

    @Override
    public void destroy() {
        System.out.println("destory EncodingFilter......");
    }
}

  2.2.写一个LoggerFilter

package org.burning.sport.filter;

import javax.servlet.*;
import java.io.IOException;

public class LoggerFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("init LoggerFilter....");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        String contextPath = request.getServletContext().getContextPath();
        System.out.println("LoggerFilter before doFilter.....");
        chain.doFilter(request, response);
        System.out.println("LoggerFilter after doFilter");
    }

    @Override
    public void destroy() {
        System.out.println("destory LoggerFilter....");
    }
}

  2.3 写一个HelloWorldServlet

package org.burning.sport.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloWorldServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("do service...." + this.getInitParameter("encoding"));
        super.service(req, resp);
    }
}

  2.4 配置web.xml

  filter的配置顺序跟执行顺序有关系

<filter>
    <filter-name>myEncodingFilter</filter-name>
    <filter-class>org.burning.sport.filter.EncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>myEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
    <filter-name>myLoggerFilter</filter-name>
    <filter-class>org.burning.sport.filter.LoggerFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>myLoggerFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
    <servlet-name>MyHelloworldServlet</servlet-name>
    <servlet-class>org.burning.sport.filter.HelloWorldServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>MyHelloworldServlet</servlet-name>
    <url-pattern>/helloServlet</url-pattern>
</servlet-mapping>

  2.5 看执行结果

启动tomcat的时候
init EncodingFilter.......
init LoggerFilter....
-----------------------------------------
before EncodingFilter doFilter.....
LoggerFilter before doFilter.....
do service....null
LoggerFilter after doFilter
after EncodingFilter doFilter......
---------------------------------------
销毁tomcat的时候
destory EncodingFilter......
destory LoggerFilter.... 

  2.6.结论:
  容器只会初始化一次
  filter的执行是有先后顺序的,根据在web.xml中配置的先后顺序

原文地址:https://www.cnblogs.com/happyflyingpig/p/8462883.html

时间: 2024-09-30 18:37:00

Filter的执行顺序的相关文章

自定义拦截器和Filter的执行顺序

自定义拦截器 Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必 须实现HandlerInterceptor接口 1.自定义实现类实现 HandlerInterceptor接口 2.在springmvc配置文件中配置相对应的拦截器 <mvc:interceptors> <!--配置自定义拦截器 ,所有的路径都拦截 --> <bean class="com.neuedu.springmvc.filter.My

04_过滤器Filter_03_多个Filter的执行顺序

[Filter链] *在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称为一个Filter链. *web服务器根据Filter在web.xml中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法,在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有fil

Servlet 3.0 之@WebFilter怎么控制多个filter的执行顺序

之前我们控制多个filter的执行顺序是通过web.xml中控制filter的位置来控制的,放在上面的会比放在下面的先执行,如下“用户登录检查过滤器”会比“接口日志过滤器”先执行   <!-- 用户登录检测过滤器 -->    <filter> <filter-name>UserLoginFilter</filter-name>         <filter-class>net.tfgzs.demo.filter.UserLoginFilter

拦截器的四种拦截方式以及Filter的执行顺序(17/4/8)

一:拦截方式 需要在配置文件web.xml配置 在对应filter-mapping节点下 如下 <filter-mapping> <filter-name>BFilter</filter-name> <url-pattern>/AServlet</url-pattern> <!-- <dispatcher>REQUEST</dispatcher>默认拦截方式 <dispatcher>FORWARD<

过滤器Filter_03_多个Filter的执行顺序

过滤器Filter_03_多个Filter的执行顺序 学习了:https://www.cnblogs.com/HigginCui/p/5772514.html 按照在web.xml中的顺序进行filter的调用: 原文地址:https://www.cnblogs.com/stono/p/9041038.html

Asp.net Mvc (Filter及其执行顺序)

应用于Action的Filter 在Asp.netMvc中当你有以下及类似以下需求时你可以使用Filter功能判断登录与否或用户权限,决策输出缓存,防盗链,防蜘蛛,本地化设置,实现动态Actionfilter是一种声明式编程方式,在Asp.net MVC中它只能应用在Action上Filter要继承于ActionFilterAttribute抽象类,并可以覆写void OnActionExecuting(FilterExecutingContext)和void OnActionExecuted(

Filter链执行顺序

配置两个Filter:BFilter和AFilter, BFilter:放行前输出3,放行,放行后输出4 AFilter:放行前输出1,放行,放行后输出2 被拦截的jsp页面输出5 执行顺序如下: 输出结果:31524 原文地址:https://www.cnblogs.com/Timeouting-Study/p/12600288.html

filter过滤器执行顺序

浏览器请求---->进入过滤器---->进入doFilter方法--->执行chain.doFilter()方法就会放行----->进入业务逻辑方法------>进入过滤器------>执行chain.doFiter()方法------>浏览器相应 还是下面一个  从我做的实验来看 是下一种 浏览器请求---->进入过滤器---->进入doFilter方法--->执行chain.doFilter()方法就会放行----->进入业务逻辑方法-

java 过滤器Filter中chain.doFilter()之前和之后代码的执行顺序

过滤器拦截到响应url的请求后会先执行doFilter()方法中chain.doFilter()之前的代码,然后执行下一个过滤器或者servelt.紧接着执行chain.doFilter()之后的代码. 一下为两个过滤器的执行顺序: 过滤器一: package com.rskd_yswb.lib.filter; import javax.servlet.*; import java.io.IOException; public class HttpRequestAndResponseFilter