跨域登录

Posted jaffray

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了跨域登录相关的知识,希望对你有一定的参考价值。

  • 引言
  • 为什么跨域登录后前端页面无法保持登录状态?
  • 跨域登录后如何保持会话?
  • 引言

前后端分离(部署)项目,登录后可能出现会话无法维持导致立即退出登录的现象。

 

  • 为什么跨域登录后前端页面无法保持登录状态?

Web 应用登录后,服务端会产生会话来存储用户信息,比如用户ID、用户名以及用户会话ID等等。当登录请求返回客户端(浏览器)时,返回信息会包含一些 Cookie 信息,通常有会话ID,JAVA后台通常是“JSESSIONID”,浏览器会根据服务端返回的 Cookie 信息产生相应的 Cookie。

如果客户端和服务端没有跨域,那么在下一次客户端请求服务端时,浏览器会自动携带 Cookie 信息,服务端检测到客户端的请求包含会话信息,经过比对,如果会话信息准确并且没有过期,那么客户端还是处于登录状态并且能访问被授权资源。

但是浏览器 不能读取跨域的 Cookie 信息。因此,当客户端跨域访问时,浏览器 不能 读取先前 跨域的服务端 返回的 Cookie 信息。服务端检测不到客户端请求的会话信息,所以,服务端判断 客户端并没有登录

 

  • 跨域登录后如何保持会话?

要解决跨域登录保持会话,首先要确保登录后的请求可以读取登录时设置的跨域 Cookie,其次是登录后的请求要能携带登录时的 Cookie。

以 jQuery 插件为例,发送请求时,设置“crossDomain: true”以及“xhrFields: withCredentials: true”即可。如下代码所示:

$.ajax(
    type: "POST",
    url: baseURL + "users/garnetlogin",
    data: data,
    contentType: "application/json",
    crossDomain: true,
    xhrFields: 
        withCredentials: true
    ,
    success: function (result) 
        // code..
    
);

 

当然,服务端也需要允许客户端跨域、允许客户端发送凭证。如下 JAVA 代码所示(假设客户端域为“http://localhost.cn”):

response.setHeader("Access-Control-Allow-Origin", "http://localhost.cn");
response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Allow-Headers", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");

 

 

以上是关于跨域登录的主要内容,如果未能解决你的问题,请参考以下文章

SSO单点登录跨域重定向跨域设置Cookie京东单点登录实例分析

mui ajax登录怎么跨域

spring boot 登录重定向外部地址,出现跨域问题 怎么办?

如何创建跨域共享登录服务?

sso单点登录之跨域cookie共享 (跨域缓存共享)

前后端分离架构下的跨域问题