Javascript 使用cookies发送随机令牌
托管bean:Javascript 使用cookies发送随机令牌,javascript,jsf,cookies,Javascript,Jsf,Cookies,托管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.randomUUI
@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>
var cookie=getCookie(“令牌”);
控制台日志(cookie);
函数getCookie(名称){
var matched=document.cookie.match(RegExp(name+“=[^;]*”));
如果(匹配){
返回匹配的[0]。拆分('=')[1];
}
返回false;
}
#{bean}
除非在不同的选项卡和/或窗口中几乎同时打开同一页面,否则它可以正常工作。当按住ctrl键多次单击与页面对应的链接时,在这种情况下,令牌在不同的选项卡上共享,这在选项卡和/或窗口中是唯一的
使用
、
或Servlet文件管理器稍微早一点设置cookie没有什么区别
如何确保cookie值始终与托管bean中新生成的值一致,并且在不同选项卡和/或窗口中频繁请求和打开同一页面时不会发生冲突?对于您试图解决的问题,是否绝对需要使用其他cookie?最可靠的方法是让JSF打印令牌,就像它是JS变量(或HTML5数据属性)一样。但这并不涉及额外的饼干。HTTP会话最多可用于将令牌与某个内容关联(最大年龄
-1
表示会话cookie)。实际的非技术性用例是什么?到目前为止,这不是真正的需求。这仅仅是试图了解如何通过WebSocket仅通知用户当前所在的特定选项卡或窗口,因为有时也可能会出现这种不寻常的要求。无论如何,我以隐藏表单字段的形式使用基于请求的令牌来适当地处理它。