cookie同域下获取的错误及解决办法java

服务器端传送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.csdn.net/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头信息,是解决跨域的一种方法。

猜你喜欢

转载自blog.csdn.net/IT_95/article/details/85998582
今日推荐