Filter过滤顺序

多个Filter过滤顺序

当存在两个Filter:filter1和filter2,两个filter过滤URL相同,此时的过滤顺序为:
在web.xml中,的配置顺序则为两个过滤器的过滤顺序。

filter1--->filter2--->doFilter---->filter2---->filter1
这种情况下,如果第二个过滤器需要得到第一个过滤器过滤之后的一些数据,则会出现空指针异常。
此时我们可以先让第一个过滤器返回,因为当存在几个过滤器只有遇到doFilter时,才会放行,也就是说才会完整的运行一次。doFilter这个方法就是一个阀值。
如果要使第一个filter先完整执行,则在第二个过滤器中,当第一个过滤进入之后,若我们并没有获取需要的数据,即直接调用doFilter()方法。此时就将返回到第一个过滤器之中。

以下通过实际代码说明两个filter的执行顺序:
第一个过滤器,为过滤登录地址,和是否登录。

`public class RestAuthenticationFilter implements Filter {

public void destroy() {

}

public void init(FilterConfig arg0) throws ServletException {

}

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    logAccessAPI(request);

    String requestURI = request.getRequestURI();
    if (requestURI.endsWith("/filter/login")) {
        **system.out.println( login before);**
        **chain.doFilter(request, response);**
        **System.out.println( login after);**
        return;
    }

    Object personId = request.getSession().getAttribute("personid");
    if (null != personId && StringUtils.isNotBlank((String) personId.toString())) {
        **system.out.println( login before);**
        **chain.doFilter(request, response);**
        **System.out.println( login after);**
        return;
    } else {
        response.setContentType("application/json;");
        ServletOutputStream sos = response.getOutputStream();
        sos.write("{\"flag\":false,\"msg\":\"session timeout, need login\",\"data\":[{}]}".getBytes());
    }
}

第二个过滤器:过滤请求的参数是否正常,是否符合自己要求。

public class DataAuthenticationFilter implements Filter{

@Override
public void destroy() {

}

@Override
public void init(FilterConfig filterConfig) throws ServletException {

}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                                                        throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;
    long start = System.currentTimeMillis();
    Enumeration<String> paramter = req.getParameterNames();

    if (paramter == null || !(FindEnum(paramter))) {
        **system.out.println( DataAuth before);**
        chain.doFilter(req, res);
        **system.out.println( DataAuth after);
        long end = System.currentTimeMillis();
        System.out.println( end - start );
        return;
    }

    String[] site_id = ((String) req.getSession().getAttribute("siteId")).split("\|");
    List<String> site = Arrays.asList(site_id);

    String site_id_check = req.getParameter("site_id");
    if (site_id_check != null){
        List<String> site_check = Arrays.asList(site_id_check.split(","));
        if (site.containsAll(site_check) && site_check != null){        
            chain.doFilter(req, res);
            long end = System.currentTimeMillis();
            System.out.println( end - start );
            return;
        }
    }
    response.setContentType("application/json;");
    ServletOutputStream sos = response.getOutputStream();
    sos.write("{\"flag\":false,\"msg\":\"site_id invalid \",\"data\":[{}]}".getBytes());
    long end = System.currentTimeMillis();
    System.out.println( end - start );
    return;

}

private boolean FindEnum(Enumeration<String> paramter){
    for(Enumeration<String> e=paramter;e.hasMoreElements();){
        if(e.nextElement().toString().equals("site_id"))
            return true;
    }
    return false;
}
}
Web.xml
在web.xml中我们的配置为:<filter>
    <filter-name>restAuthenticationFilter</filter-name>
    <filter-class>com.envision.envservice.filter.RestAuthenticationFilter</filter-class>
</filter>

<filter>
    <filter-name>dataAuthenticationFilter</filter-name>
    <filter-class>com.envision.envservice.filter.DataAuthenticationFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>restAuthenticationFilter</filter-name>
    <url-pattern>/services/*</url-pattern>
</filter-mapping>

<filter-mapping>
    <filter-name>dataAuthenticationFilter</filter-name>
    <url-pattern>/services/*</url-pattern>
</filter-mapping>

如果第一次我们请求的资源地址为:http://127.0.0.1:8080/filter/services/login
此时打印输出的信息为:

login before
DataAuth before
doFilter
DataAuth after
login after

过滤顺序即可以看出是什么顺序,也我们必要的时候,也可以控制他先将某些过滤器“跳过”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cpp编程小茶馆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值