【问题标题】:JQuery jsession cookie is not sent to a serverJQuery jsession cookie未发送到服务器
【发布时间】:2012-04-08 03:20:47
【问题描述】:

我搜索过 jquery 论坛、stackoverflow、google、bing,甚至 yahoo,但都没有成功。 每 10 秒我试图通过这个 JQuery sn-p 从 logservlet servlet 加载文本数据:

    <script type="text/javascript" src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
    <script type="text/javascript">
            var autorefresh = setInterval(function () {
                $.ajax({
                    url : "logservlet?devkey=chat",
                    success : function(data) {
                        $("#log_ta").append(data);
                    }
                });
                }, 10000);
    </script>

问题是,在服务器端,我没有看到有效的会话,我在其中尝试跟踪会话属性。该问题似乎与来自 JQuery 的 http 请求的标头中缺少“Cookie JSESSIONID=xxxxxxxxxxxxxxxxxxxxxxxxxxx”有关。我从服务器获取响应标头,JSESSIONID 总是随着每个请求而变化:

    Server  Apache-Coyote/1.1
    Set-Cookie  JSESSIONID=9EEAFA2A933E7742D8FEDADD5345B76D; Path=/CumulusServer
    Content-Length  0
    Date    Fri, 23 Mar 2012 13:02:08 GMT

但是 JQuery 后面没有用到,这里是请求头:

    Host    192.168.1.11:8080
    User-Agent  Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0
    Accept  */*
    Accept-Language en-us,en;q=0.5
    Accept-Encoding gzip, deflate
    Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Connection  keep-alive
    X-Requested-With    XMLHttpRequest
    Referer http://192.168.1.11:8080//CumulusServer/

这里有什么问题? “$.ajax”调用不是会话感知的吗?还是我错过了一些管道代码来在每个 ajax 请求中手动硬编码 JSESSIONID?是这样,这应该是什么样子?顺便说一句,当我从 Web 浏览器调用相同的 url 时,JSESSIONID 标头被发送到服务器!

谢谢, D.

【问题讨论】:

    标签: jquery session cookies jsessionid


    【解决方案1】:

    确实,我确实运行过 Adblock Plus,(感谢您的提示)但它与此无关。 其实事情有点棘手。我找到了两个解决方案,但我没有解释发生了什么。

    解决方案 #1: - 在页面加载时手动保存 JSESSIONID:

        var Session = {
           id : '${pageContext.session.id}',
           user : '${pageContext.request.remoteUser}'
        };
    
        $(window).load(function () {
            setCookie('JSESSIONID',Session.id);
        });
    
        function setCookie(name,value,expires,path,domain,secure) {
            var cookieString = name + "=" +escape(value) +
               ( (expires) ? ";expires=" + expires.toGMTString() : "") +
               ( (path) ? ";path=" + path : "") +
               ( (domain) ? ";domain=" + domain : "") +
               ( (secure) ? ";secure" : "");
            document.cookie = cookieString;
        }
    

    这工作正常,JSESSIONID 会相应地在下一个 ajax 请求中发送。

    解决方案 #2: - 在 servlet doGet() 方法中添加“text/plain”mime 类型。 最初在我的测试中,我根本没有设置任何内容类型。在我意识到 JQuery 默认需要 XML 响应后,我更改了我的服务器 doGet() 方法以明确设置内容类型,如下所示:

    resp.setContentType("text/plain");

    现在,ajax 调用也可以正常工作,实际上不需要手动管理 cookie。我没有解释为什么解决方案 #2 有效,但它确实有效。

    谢谢, D.

    【讨论】:

      【解决方案2】:

      检查您的浏览器中是否安装了任何广告拦截器。许多人会从 XHR 中删除 cookie。

      【讨论】:

        猜你喜欢
        • 2016-10-15
        • 2015-06-30
        • 2015-09-21
        • 2021-11-13
        • 2018-08-20
        • 2016-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多