如果用户第二次访问网站(任何页面),我有一个任务要在网站上执行一些操作(弹出)。我决定用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/