Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用cookies发送随机令牌_Javascript_Jsf_Cookies - Fatal编程技术网

Javascript 使用cookies发送随机令牌

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

托管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>

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仅通知用户当前所在的特定选项卡或窗口,因为有时也可能会出现这种不寻常的要求。无论如何,我以隐藏表单字段的形式使用基于请求的令牌来适当地处理它。