java - Servlet过滤器被多次调用

标签 java servlets tiles

如果用户第二次访问网站(任何页面),我有一个任务要在网站上执行一些操作(弹出)。我决定用Servlet Filter + cookie来实现。但我遇到了问题 - 过滤器调用多次,我认为这与使用图 block 有关。 你能帮我修好吗?或者也许有人知道实现此任务的最佳实践。

过滤器:

@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>

最佳答案

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

例如:

  • <h:commandLink >单击时执行 GET 和 POST 请求
  • <h:link >单击时仅执行 GET 请求

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

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

关于java - Servlet过滤器被多次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27960359/

相关文章:

java - 基于packagewise在Maven中创建jar文件

java - 生成动态表以及动态单选按钮以进一步在 JSP 中生成动态表

java - 无法让瓷砖与 spring mvc 3 一起使用

java - 如何使用其中一个属性值获取 Firebase 中同一个表中的另一个属性值

java - Jackson-jr 读取多态ArrayList

java - 删除 HttpSessionListener 中的 Cookie

web-applications - 仅将 jetty url-pattern 匹配到根目录

javascript - 纯 HTML + JavaScript 客户端模板

java - apache tiles 2 JSPException 包括路径

java - 带有 TextFormatter 和/或 UnaryOperator 的 JavaFX 8 中用于整数的数字文本字段