我们在浏览器中,经常涉及到数据的交换,比如你登录邮箱,登录一个页面。我们经常会在此时设置多少天内记住我,或者自动登录选项。那么它们是怎么记录信息的呢,答案就是用到Cookie技术,Cookie是由HTTP服务器设置的,保存在浏览器中。因为HTTP协议是一个无状态协议,它不对之前发生的请求和响应的状态进行管理。也就是说,无法根据之前的状态进行本次的请求处理。于是引入了Cookie技术,Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端信息。
Cookie会根据从服务器断发送的响应报文中一个Set-Cookie的首部字段信息,通知客户端保存Cookie。当下一次客户端再往服务器发起请求的时候,客户端就会在请求的报文中假如Cookie的值后再发送。
Cookie和session的区别
Cookie
1.Cookie是在HTTP下,它是Web服务器保存在用户浏览器上的小文件;
2.Cookie信息存放在客户端中,所以它的安全性不高
3.当个Cookie保存的数据不能超过4k,很多浏览器都限制最多只能保存20个Cookie
4.也是正以为Cookie保存在本地,所以它的性能也就会更高一些。
session
1.session是指用来在客户端与服务器端之间保持状态的解决方案以及存储结构;
2.session会一定时间内保存在服务器上;当访问量增加的时候,就会降低服务器的性能。
Cookie的分类:
1.会话Cookie:是指不设定它的生命周期expries时的状态(浏览器的开启到关闭就是一次会话),当关闭浏览器的时候,会话Cookie响应的也会随之销毁;但是当关闭一个浏览器中的一个页面的时候不会造成Cookie的销毁。
2.持久Cookie:设定了它的生命周期expries;这时即使关闭了浏览器后Cookie也不会销毁,知道设定的过期时间。
Cookie的属性
/** Cookie name */
private final String name;
/** Cookie attributes as specified by the origin server */
private Map<String, String> attribs;
/** Cookie value */
private String value;
/** Comment attribute. */
private String cookieComment;
/** Domain attribute. 域名*/
private String cookieDomain;
/** Expiration {@link Date}. 失效时间 */
private Date cookieExpiryDate;
/** Path attribute. 路径*/
private String cookiePath;
/** My secure flag. 是否安全连接*/
private boolean isSecure;
/** The version of the cookie specification I was created from. */
private int cookieVersion;
private Date creationDate;
示例代码取出response中的cookie信息保到Map中
package com.mark.TestOther;
/**
* .java.io.IOException: Server returned HTTP response code: 403
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
/***
* 1.构造一个URL对象
* 2.调用这个这个URL对象的openConnection()--->获得一个URLConnection对象
* 3.配置URLConnection
* 4.读取首部信息
* 5.获得输入流--->读取数据
* 6.获得输出流--->写入数据
* 7.关闭连接
* @author YIMA
*
*/
public class HttpURLConnectionTest {
private static String TARGET_URL ="***访问的URL";
private static String user_agent_value="Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; GTB7.5; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727)";
//是否需要保存cookie信息
private boolean enableCookie = true;
private Map<String,String> cookieMap ;
public static void main(String[] args) throws IOException{
HttpURLConnectionTest test = new HttpURLConnectionTest();
System.out.println(test.getResponse());
}
private String getResponse() throws IOException {
URL url = null;
HttpURLConnection http = null;
BufferedReader bufferedReader =null;
InputStream inputStream = null;
StringBuffer sTotalString = new StringBuffer();
try{
//1.构造一个URL对象
url = new URL(TARGET_URL);
//2.调用这个这个URL对象的openConnection()
http = (HttpURLConnection) url.openConnection();
//3设置请求的方式
http.setRequestMethod("GET");
//设置头部的请求参数
http.setRequestProperty("User-Agent", user_agent_value);
//5.获得输入流--->读取数据
inputStream = http.getInputStream();
bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
// 6.获得输出流--->写入数据
String sCurrentLine = null;
while((sCurrentLine = bufferedReader.readLine())!= null){
sTotalString.append(sCurrentLine);
sTotalString.append("\r\n");
}
//是否需要保存cookie
if(enableCookie){
parseCookieProperties(http);
}
return sTotalString.toString();
}catch(MalformedURLException e){
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
bufferedReader.close();
inputStream.close();
http.disconnect();
}
return null;
}
//取出response信息中的cookie信息保存到一个Map中
//这里只保存cookie中的name 和 value 的信息,而path,demain等没有保存
private void parseCookieProperties(HttpURLConnection http) {
//如果服务器返回的信息中没有Set-Cookie,就结束
if(http.getHeaderFields().get("Set-Cookie").size()==0){
return;
}
if(cookieMap == null){
cookieMap = new HashMap<String, String>();
}
for(String cookie:http.getHeaderFields().get("Set-Cookie")){
System.out.println(cookie);
if(cookie == "" || !cookie.contains("=")){
continue;
}
String cookieName = cookie.substring(0, cookie.indexOf("="));
String cookieValue = cookie.substring(cookie.indexOf("=") + 1);
if(cookie.contains(";")){
cookieValue = cookie.substring(cookie.indexOf("=") + 1, cookie.indexOf(";"));
}
cookieMap.put(cookieName, cookieValue);
}
}
}
代码中关键方法
http.getHeaderFields().get(“key”):在response head中根据key值相应的value值。
//取出response信息中的cookie信息保存到一个Map中
//这里只保存cookie中的name 和 value 的信息,而path,demain等没有保存
private void parseCookieProperties(HttpURLConnection http) {
//如果服务器返回的信息中没有Set-Cookie,就结束
if(http.getHeaderFields().get("Set-Cookie").size()==0){
return;
}
if(cookieMap == null){
cookieMap = new HashMap<String, String>();
}
for(String cookie:http.getHeaderFields().get("Set-Cookie")){
System.out.println(cookie);
if(cookie == "" || !cookie.contains("=")){
continue;
}
String cookieName = cookie.substring(0, cookie.indexOf("="));
String cookieValue = cookie.substring(cookie.indexOf("=") + 1);
if(cookie.contains(";")){
cookieValue = cookie.substring(cookie.indexOf("=") + 1, cookie.indexOf(";"));
}
cookieMap.put(cookieName, cookieValue);
}
}
http.getHeaderFields().get(“Set-Cookie”)中的信息为:
[TS011605d9=019783f6d94e248df5352a365e2a7787576a68b8321cf353224336585095ac6835b644320cbc4f5791b7177e928a35a4a5aae80143cc00b903c7bedf840dd495a87b17a3cf3380f3900fa846036c814e7c9650965a; Path=/; Domain=.www.hmm21.com,
JSESSIONID=LE2oRNK3WUuV3HB11a18wUanS2BhCWv2JYRjK6z4jb3e9U3xMnEgA3koKHmMp0X3.HmmWas2_servlet_hmm21;Path=/, WMONID=sfujvTWekB2;Expires=Sat, 01-Dec-2018 02:38:37 GMT;Path=/]
最后cookieMap保存结果的格式:
{
TS011605d9=****,
WMONID=***,
JSESSIONID=***
}
部分内容摘抄于《图解HTTP》