如果用户第二次访问网站(任何页面),我有一项任务是在网站上执行某些操作(弹出窗口)。我决定用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>
答案 0 :(得分:0)
如果您使用的是JSF,请务必注意不同的JSF组件在执行时执行不同的GET和POST请求组合。
例如:
<h:commandLink >
同时执行GET和POST请求<h:link >
点击后只执行GET请求如果您使用过滤器并单击<h:commandLink >
,您会注意到过滤器被调用两次
另外,请记住,与web.xml中定义的url模式匹配的任何类型的请求(ajax,资源等)都将通过过滤器,因此将多次调用它。
您可以使用浏览器开发人员工具来检查正在执行的请求类型和数量。