Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.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 使用AngularJS忽略HTTP标头中的Set Cookie_Javascript_Angularjs_Cookies_Setcookie - Fatal编程技术网

Javascript 使用AngularJS忽略HTTP标头中的Set Cookie

Javascript 使用AngularJS忽略HTTP标头中的Set Cookie,javascript,angularjs,cookies,setcookie,Javascript,Angularjs,Cookies,Setcookie,我正在开发一个基于客户端AngularJS和服务器端Java for my API(Tomcat+Jersey for WS)的应用程序 我的API的某些路径受到限制,如果用户没有会话,则返回的响应状态为401。在客户端,401HTTP状态被截获,以将用户重定向到登录页面 一旦用户通过身份验证,我就在服务器端创建一个会话 httpRequest.getSession(true); 有没有办法让套装饼干正常工作? 这是与AngularJS相关的问题吗 添加意味着浏览器不应该让插件和JavaScri

我正在开发一个基于客户端AngularJS和服务器端Java for my API(Tomcat+Jersey for WS)的应用程序

我的API的某些路径受到限制,如果用户没有会话,则返回的响应状态为401。在客户端,401HTTP状态被截获,以将用户重定向到登录页面

一旦用户通过身份验证,我就在服务器端创建一个会话 httpRequest.getSession(true); 有没有办法让套装饼干正常工作? 这是与AngularJS相关的问题吗

添加意味着浏览器不应该让插件和JavaScript看到cookie。这是最新的安全浏览约定。应该用于J_SESSIONID,但可能不在这里。

我找到了一个帮助我前进的方法

似乎
“访问控制允许凭据”:未在客户端设置true
。 忽略指令
$httpProvider.defaults.withCredentials=true


我用配置参数中的{withCredentials:true}替换$resource调用,使用一个简单的$http调用。

我解决了一个与您非常相似的问题。 我的剧本!后端试图设置一个会话Cookie,但我无法在Angular中捕获或通过浏览器存储该Cookie

事实上,这个解决方案涉及到一点这个和一点那个。

假设您已经解决了初始问题(只能通过向Access Control Allow Origin添加特定域并删除通配符来解决),接下来的步骤是:

  • 您只需从
    Set Cookie
    头中删除HTTP,否则您将永远无法接收由您的代码“生成”的Cookie
    此设置将在Firefox中运行,但不在Chrome中运行

  • 要使其也适用于Chrome,您需要:

    a) 在cookie中使用您的WS“托管”的域从localhost发送不同的域。您甚至可以使用通配符,如
    .domain.com
    ,而不是
    ws.domain.com

    b) 然后,您需要调用cookie中指定的域,否则Chrome将不会存储您的cookie

    [可选]我将删除该
    /api
    路径以支持
    /


  • 这应该是关键。

    希望对您有所帮助

    您需要同时在服务器端和客户端进行工作

    客户端

    通过以下方法之一将
    $http
    config
    withCredentials
    设置为
    true

  • 按要求

    var config = {withCredentials: true};
    $http.post(url, config);
    
  • 对于所有请求

    angular.module("your_module_name").config(['$httpProvider',
      function($httpProvider) {
        $httpProvider.interceptors.push(['$q',
          function($q) {
            return {
              request: function(config) {
                config.withCredentials = true;
                return config;
              }
            };
          }
        ]);
      }
    ]);
    
  • 服务器


    在客户端的post请求中,将响应标题
    访问控制允许凭据
    设置为

    ,确保添加以下内容:

    对于jquery ajax请求:

    $.ajax({
    url:“http://yoururlgoeshere",
    类型:“post”,
    数据:“somedata”,
    xhrFields:{
    证书:正确
    }
    
    });刚刚解决了这样一个问题

    我在做这件事,但没有工作…:

      $cookies.put('JSESSIONID', response.data);
    
    Cookie保存在浏览器中,但当我发送新请求时,所有Cookie都被发送,而我的请求除外。(我的cookie是JSESSIONID)

    然后我查看chrome inspector,发现了以下内容:

    问题是这不是正确的路径

    然后我尝试了这个,我的饼干被送去了。耶

    $cookies.put('JSESSIONID', response.data, {'path':'/'});
    
    我不知道这是否是你的情况,但这对我很有效


    问候

    即使HttpOnly属性不存在,也不会在客户端设置cookie。是否确定?它是仅用于/api/的会话cookie。一个实验是对链接使用
    response.encodeURL
    。第一个答案可能仍然使用“…?JSESSIONID=…”而不是cookie。但是后续调用应该设置cookie。您是否在浏览器中查找cookie?是的,当我使用Chrome查看cookie是否在浏览器中设置和/或是否存在于请求和响应标题中时。cookie仅用于会话是。我不知道是否未设置localhost/api的cookie。您可以尝试删除HttpOnly(这很有趣),或者将cookie设置为localhost/而不是localhost/api(不太可能);如果您希望浏览器能够在随后的XHR调用中存储和使用Cookie,请使用Set Cookie(如果有)。如果您找到了解决方案,请不要忘记发布答案。如果您的客户端是移动的,并且您正在使用phonegap/cordova或本机客户端,您是否尝试覆盖源站/参照者标题并使用恒定的源站?您可以在后端获取源站,然后发送相关标题。下面是一个express.js示例:var origin=req.headers.origin;res.header(“访问控制-允许-来源”,来源);您似乎同时发布了一个答案和一个问题作为答案。要提出新问题,请使用页面顶部的“提问”按钮。如果此问题有助于提供上下文,您可以链接到此问题。您必须显式返回“访问控制允许来源”的正确域,当“访问控制允许凭据”为true时为“”。不允许使用星号。因此,如果允许多个来源,人们要做的是让函数拦截请求来源,验证该来源是否在允许列表中,并在“访问控制允许来源”中设置请求来源。e、 g.我希望localhost和example.com能够正常工作。因此,当一个请求从localhost传入时,我的头必须是“Access Control Allow Origin”,“localhost”,例如.com“Access Control Allow Origin”,“example.com”,我不确定它是否仍然相关,但让API依赖于状态是一个糟糕的设计选择(tm)。你应该使你的API无状态以避免将来的问题。我相信问题在于路径是/API,当你说“使用你的WS“托管”的域从cookie中的localhost发送不同的域”时,路径应该是/你说的是前端主机还是后端主机?通常它应该是你的后端,但这实际上取决于
      $cookies.put('JSESSIONID', response.data);
    
    $cookies.put('JSESSIONID', response.data, {'path':'/'});