托管bean:
@Named
@ViewScoped
public class Bean implements Serializable {
private static final long serialVersionUID = 1L;
public Bean() {}
@PostConstruct
public void init() {
Cookie cookie = new Cookie("token", UUID.randomUUID().toString());
cookie.setMaxAge(-1);
((HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse()).addCookie(cookie);
}
}
名为token
的Cookie以@PostConstruct
方法添加到响应中。
JavaScript试图通过以下方式访问此cookie。
<h:head>
<script type="text/javascript">
var cookie = getCookie("token");
console.log(cookie);
function getCookie(name) {
var matched = document.cookie.match(RegExp(name + "=.[^;]*"));
if (matched) {
return matched[0].split('=')[1];
}
return false;
}
</script>
</h:head>
<h:body>
<h:form>
#{bean}
<h:form>
</h:body>
除非在不同的标签和/或窗口中几乎同时打开相同的页面,否则它会正常工作,当按住 ctrl 键多次单击与页面对应的链接时令牌在不同的标签之间共享,预计在标签和/或窗口之间是唯一的。
使用<f:event type="preRenderView" listener="#{bean.init}">
,<f:viewAction action="#{bean.init}">
或Servlet文件管理器稍早设置cookie没有任何区别。
如果经常请求并在不同的标签和/或窗口中打开同一页面,如何确保cookie值始终根据托管bean中的新生成值而不会发生冲突?