Servlet过滤器被多次调用

时间:2015-01-15 09:30:38

标签: java servlets tiles

如果用户第二次访问网站(任何页面),我有一项任务是在网站上执行某些操作(弹出窗口)。我决定用Servlet Filter + cookie实现它。但是我遇到了问题 - 多次过滤掉调用,我认为这与使用瓷砖有关。 你能帮我解决一下吗?或者也许有人知道实现此任务的最佳实践。

过滤器:

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
    System.out.println("Do filter..............");

    final HttpServletRequest request = (HttpServletRequest) servletRequest;
    final HttpServletResponse response = (HttpServletResponse) servletResponse;
    String valueFromCookie = getCookieValue(request.getCookies(), EMAIL_POPUP_COOKIE);

    Cookie cookie = new Cookie(EMAIL_POPUP_COOKIE, "");
    cookie.setPath("/");
    cookie.setComment("Email Pop up cookie");
    cookie.setMaxAge(COOKIE_LIFE_TIME);

    if (valueFromCookie == null){
        String valueToCookie = URLEncoder.encode(FIRST_VISIT, "UTF-8");
        cookie.setValue(valueToCookie);
        response.addCookie(cookie);
    } else {
        if (valueFromCookie.equals(FIRST_VISIT)){
            String valueToCookie = URLEncoder.encode(NOT_SHOW, "UTF-8");
            cookie.setValue(valueToCookie);
            response.addCookie(cookie);
            System.out.println("STOP!=======================>");
        }
    }

    chain.doFilter(request, servletResponse);
}

web.xml部分:

<filter-mapping>
    <filter-name>EmailPopUp</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

1 个答案:

答案 0 :(得分:0)

如果您使用的是JSF,请务必注意不同的JSF组件在执行时执行不同的GET和POST请求组合。

例如:

  • <h:commandLink >同时执行G​​ET和POST请求
  • <h:link >点击后只执行GET请求

如果您使用过滤器并单击<h:commandLink >,您会注意到过滤器被调用两次 另外,请记住,与web.xml中定义的url模式匹配的任何类型的请求(ajax,资源等)都将通过过滤器,因此将多次调用它。

您可以使用浏览器开发人员工具来检查正在执行的请求类型和数量。