servlet过滤器被多次调用

q7solyqu  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(246)

我有一个任务做一些行动(弹出窗口)的网站,如果用户第二次访问网站(任何网页)。我决定用servlet过滤器+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>
g0czyy6m

g0czyy6m1#

在使用jsf的情况下,需要注意的是,不同的jsf组件在执行get和post请求时执行不同的组合。
例如: <h:commandLink > 单击时执行get和post请求 <h:link > 单击时仅执行get请求
如果您正在使用过滤器并单击 <h:commandLink > 您将注意到过滤器被调用了两次。
此外,请记住,与web.xml中定义的url模式匹配的任何类型的请求(ajax、资源等)都将通过过滤器,因此它将被多次调用。
您可以使用浏览器开发人员工具来检查正在执行的请求的类型和数量。

相关问题