服务器端传送cookie到客户端,但是在浏览器cookie中可以查看到set-cookie,但就是取不出的状况。存在cookie打印输出为空的情况。
原因:存在跨域问题。
解决办法:1、将后端和前端放在同域中就可以获取cookie值。和session一样,在同域中可以获取cookie;
2、跨域请求cookie(前后端分离)
首先,供上后端存入cookie的代码(这里没用上Access-Control-Allow-Origin等解决跨域,使用CORS三方解决跨域)
注意:一定要用userCookie.setPath("/");。设置在不同路径下都可以访问到cookie,否则尽管保持同域,cookie数据打印也可能为空。
同源策略是浏览器保证安全的基础,它的含义是指,A网页设置的 Cookie,B网页不能打开,除非这两个网页同源。 所谓同源是指:
- 协议相同
- 域名相同
- 端口相同
例如:http://www.a.com/login,协议是http
,域名是www.a.com
,端口是80
。只要这3个相同,我们就可以在请求(Request)时带上Cookie, 在响应(Response)时设置Cookie。
@ResponseBody
@RequestMapping("/cookie")
public String b(HttpServletRequest request,HttpServletResponse response){
// response.setHeader("Access-Control-Allow-Origin", "*");
// response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
// response.setHeader("Access-Control-Allow-Credentials","true");
String name="asdasdasdasd";
String loginInfo = "{\"name\":\""+name+"\"}";
//System.out.println(loginInfo);
Cookie userCookie = new Cookie("loginInfo", loginInfo);
userCookie.setPath("/");
response.addCookie(userCookie);
//Cookie[] cook =request.getCookies();
//System.out.println(cook.toString());
return "abc";
}
前端提取代码(本地运行ip为192.168.1.225。此为域名ip)
$.ajax({
type:"post",
data:{},
url:"http://192.168.1.225:8080/new/cookie",
success: function getCookie(){
console.log(document.cookie);
}
})
案例:
一、同域案例,问题解析
如果同域中也可能出现问题,导致jquery报错
原因:将ajax中的url为保持同域,需要将url和访问的服务器ip保持一致。就不会报错。
console.log运行结果如下:
之后可以剪辑字符串,获得cookie中的所需信息。
二、跨域请求cookie分析(这里的跨域只是同ip下跨端口,跨ip还在研究)
打印输出为空
前端取cookie数据时需要注意,一定要加上datatype:'jsonp'。否则依旧会取出为空
function checkCookie()
{
$.ajax({
type:"post",
data:{},
dataType : 'jsonp',
url:"http://192.168.1.225:8080/new/cookie",
success: function getCookie(loginInfo){
console.log(document.cookie);
}
});
使用json方式,在后端接口中加入callback参数与返回。后端代码如下
@ResponseBody
@RequestMapping("/cookie")
public String b(HttpServletRequest request,HttpServletResponse response,String callback){
// response.setHeader("Access-Control-Allow-Origin", "*");
// response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
// response.setHeader("Access-Control-Allow-Credentials","true");
String name="asdasdasdasd";
String loginInfo = "{\"name\":\""+name+"\"}";
//System.out.println(loginInfo);
Cookie userCookie = new Cookie("loginInfo", loginInfo);
userCookie.setPath("/");
response.addCookie(userCookie);
//Cookie[] cook =request.getCookies();
//System.out.println(cook.toString());
if (org.apache.commons.lang.StringUtils.isNotBlank(callback)) {
return callback+"('success')";
}
return "success";
}
针对network中的response.header和request.header详解(借鉴https://blog.youkuaiyun.com/u014466635/article/details/81004127)
1)请求(客户端->服务端[request])
GET(请求的方式) /newcoder/hello.html(请求的目标资源) HTTP/1.1(请求采用的协议和版本号)
Accept: */*(客户端能接收的资源类型)
Accept-Language: en-us(客户端接收的语言类型)
Connection: Keep-Alive(维护客户端和服务端的连接关系)
Host: localhost:8080(连接的目标主机和端口号)
Referer: http://localhost/links.asp(告诉服务器我来自于哪里)
User-Agent: Mozilla/4.0(客户端版本号的名字)
Accept-Encoding: gzip, deflate(客户端能接收的压缩数据的类型)
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT(缓存时间)
Cookie(客户端暂存服务端的信息)
Date: Tue, 11 Jul 2000 18:23:51 GMT(客户端请求服务端的时间)
2)响应(服务端->客户端[response])
HTTP/1.1(响应采用的协议和版本号) 200(状态码) OK(描述信息)
Location: http://www.baidu.com(服务端需要客户端访问的页面路径)
Server:apache tomcat(服务端的Web服务端名)
Content-Encoding: gzip(服务端能够发送压缩编码类型)
Content-Length: 80(服务端发送的压缩数据的长度)
Content-Language: zh-cn(服务端发送的语言类型)
Content-Type: text/html; charset=GB2312(服务端发送的类型及采用的编码方式)
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT(服务端对该资源最后修改的时间)
Refresh: 1;url=http://www.it315.org(服务端要求客户端1秒钟后,刷新,然后访问指定的页面路径)
Content-Disposition: attachment; filename=aaa.zip(服务端要求客户端以下载文件的方式打开该文件)
Transfer-Encoding: chunked(分块传递数据到客户端)
Set-Cookie:SS=Q0=5Lb_nQ; path=/search(服务端发送到客户端的暂存数据)
Expires: -1//3种(服务端禁止客户端缓存页面数据)
Cache-Control: no-cache(服务端禁止客户端缓存页面数据)
Pragma: no-cache(服务端禁止客户端缓存页面数据)
Connection: close(1.0)/(1.1)Keep-Alive(维护客户端和服务端的连接关系)
Date: Tue, 11 Jul 2000 18:23:51 GMT(服务端响应客户端的时间)
在服务器响应客户端的时候,带上Access-Control-Allow-Origin头信息,是解决跨域的一种方法。