您的位置:首页 > 理论基础 > 计算机网络

对java的 cookie处理进行修正(附http的相关知识)

2014-02-07 17:15 555 查看


如何为cookie设置HttpOnly

http://zhenghaoju700.blog.163.com/blog/static/13585951820138267195385/


HTTP HEADER 详解

http://www.open-open.com/lib/view/open1342064478859.html


HTTP Cookie

/article/6101312.html

一、cookie的各个属性及解释:

Set-Cookie响应头的格式如下所示:

Set-Cookie: <name>=<value>[; <name>=<value>]...

[; expires=<date>][; max-age=<整数,以秒为单位>][; domain=<domain_name>]

[; path=<some_path>][; secure][; httponly]

expires=<date>: 设置cookie的有效期,如果cookie超过date所表示的日期时,cookie将失效。跟max-age有同样功能。请注意,假如没有设置expires,那么请不要设置domain,因为这似乎是规则。

如果没有设置这个选项,那么cookie将在浏览器关闭时失效。

注意:date是格林威治时间(GMT),使用如下格式表示:

DAY, DD MMM YYYY HH:MM:SS GMT

DAY

The day of the week (Sun, Mon, Tue, Wed, Thu, Fri, Sat).

DD

The day in the month (such as 01 for the first day of the month).

MMM

The three-letter abbreviation for the month (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec).

YYYY

The year.

HH

The hour value in military time (22 would be 10:00 P.M., for example).

MM

The minute value.

SS

The second value.

domain=<domain_name> :

path=<some_path>:

注:临时cookie(没有expires参数的cookie)不能带有domain选项。

当客户端发送一个http请求时,会将有效的cookie一起发送给服务器。

如果一个cookie的domain和path参数和URL匹配,那么这个cookie就是有效的。

一个URL中包含有domain和path,可以参考http://www.w3school.com.cn/html/html_url.asp

max-age:失效的时间,与expires不要同时使用。

secure : 表示cookie通过https连接传送,假如是http,那么就不会被传送。

httponly : 表示cookie不能被客户端脚本获取到。

注意:domain=localhost 不合法原因:

document.cookie="setColor="+escape(color)+";expires="+ckDate.toGMTString()+";path=/;domain=localhost";

始终无法全站cookie生效 ,因为domain=localhost localhost是不合法域名

可以改成 127.0.0.1 或者该系统 host文件 127.0.0.1 test.com

但是改了后

就要以test.com/ck/1.html

或者127.0.0.1/ck.1.html访问

以你的 domain= 的值为准

一、写入cookie。

相关代码文件:

【CookieUnit】

package Easis.HTTP;

import java.util.Date;

/**
* 参数的解释详见:
* http://blog.csdn.net/cdnight/article/details/18966475 */
public class CookieUnit {
public String key="";
public String value="";
public int Max_Age=0;
public String Domain="";
public String Path="";
public boolean Secure=false;
public boolean HTTPOnly=false;
/**
* 到期时间
* */
public Date expires=null;

public CookieUnit(String _key,String _value,String _domain,String _path,Date _expires,boolean _secure,boolean _httpOnly){
key=_key;
value=_value;
expires=_expires;
Domain=_domain;
Path=_path;
Secure=_secure;
HTTPOnly=_httpOnly;
}
public CookieUnit(String _key,String _value,String _domain,String _path,int _max_age,boolean _secure,boolean _httpOnly){
key=_key;
value=_value;
Max_Age=_max_age;
Domain=_domain;
Path=_path;
Secure=_secure;
HTTPOnly=_httpOnly;
}
public CookieUnit(String _key,String _value,int _maxAage,boolean _secure,boolean _httpOnly){
key=_key;
value=_value;
Max_Age=_maxAage;
Secure=_secure;
HTTPOnly=_httpOnly;
}
public CookieUnit(String _key,String _value,Date _exipres,boolean _secure,boolean _httpOnly){
key=_key;
value=_value;
expires=_exipres;
Secure=_secure;
HTTPOnly=_httpOnly;
}

}


【CookieHelper】

package Easis.HTTP;

import Easis.Common.StringUtil;

import javax.servlet.http.HttpServletResponse;
import java.text.SimpleDateFormat;
import java.util.Locale;

/**
* 这个方法用于重新解释cookie,并且实现secure及httponly等cookie属性。。
* 基本的cookie字符串格式:
* key=value; Expires=date;  Domain=domain; Path=path;Secure; HttpOnly
*         Set-Cookie: <name>=<value>[; <name>=<value>]...
[; expires=<date>][; domain=<domain_name>]
[; path=<some_path>][; secure][; httponly]
* */
public class CookieHelper {

/**
* 添加cookie,当然,这个其实是将cookie的内容转换成为字符串,然后添加到header。
* 例如:
* response.addHeader("Set-Cookie",  "__wsidd=hhghgh ;Domain=localhost; Path=/; Max-Age=36000; Secure; HTTPOnly;");
* 例子二:
* Set-Cookie:customer=huangxp; path=/foo; domain=.ibm.com;
* expires= Wednesday, 19-OCT-05 23:12:40 GMT; [secure]
* 注意,expires已经被Max-Age所代替。
* */
public static void addCookie(HttpServletResponse response,CookieUnit _cookie){
if(response==null||_cookie==null){
return;
}
if(StringUtil.isNullOrEmpty(_cookie.key)){
return;
}
StringBuilder sb=getCookieStr(_cookie);
response.addHeader("Set-Cookie",sb.toString());
}
private static StringBuilder getCookieStr(CookieUnit _cookie){

StringBuilder sb=new StringBuilder();
sb.append(_cookie.key.trim());
sb.append('=');
if(!StringUtil.isNullOrEmpty(_cookie.value)){
sb.append(_cookie.value.trim());
}

//--max age属性或者expires属性,两者只能选择其中一个
if(_cookie.expires!=null){
//--只有expires存在的情况下才能设置domain。
sb.append("; expires=");
//--格林威志时间格式化,注意,这是这个参数的格式要求。
SimpleDateFormat sdf = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss 'GMT'", Locale.US);
sb.append(sdf.format(_cookie.expires));
}
else{
sb.append("; max-age=");
sb.append(_cookie.Max_Age);
}
//--domain字符串
if(!StringUtil.isNullOrEmpty(_cookie.Domain)){
sb.append("; domain=");
sb.append(_cookie.Domain.trim());
}
//--构造path字符串
if(!StringUtil.isNullOrEmpty(_cookie.Path)){
sb.append("; path=");
sb.append(_cookie.Path.trim());
}
//--构造secure属性
if(_cookie.Secure){
sb.append("; Secure");
}
//--构造httponly属性
if(_cookie.HTTPOnly){
sb.append("; HttpOnly");
}
return sb;
}
}


【测试的jsp页面】

<%@ page import="Easis.HTTP.CookieHelper" %>
<%@ page import="Easis.HTTP.CookieUnit" %>
<%@ page import="java.util.Calendar" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
// ;
// response.addHeader("Set-Cookie",  "__wsidd=hhghgh;Domain=localhost;Path=/;Max-Age=36000;Secure;HTTPOnly;");
//response.addHeader("Set-Cookie",  "__wsidd3=hhgiiiiihgh;Domain=localhost;Path=/;Max-Age=34785;");
//response.addHeader("Set-Cookie",  "__wsidd7=hhgiiiiihgh;Domain=localhost;Path=/;Max-Age=3478;HTTPOnly");
/*
CookieUnit _cookie1=new CookieUnit("t_local1","mvalue1","localhost","/",3600,true,true);
CookieUnit _cookie2=new CookieUnit("t_local2","mvalue2","localhost","/",378,false,true);
CookieUnit _cookie3=new CookieUnit("t_local3","mvalue3","localhost","/",3057,false,false);*/
CookieUnit _cookie1=new CookieUnit("t_local1","mvalue1",3600,true,true);
CookieUnit _cookie2=new CookieUnit("t_local2","mvalue2",3600,false,true);
CookieUnit _cookie3=new CookieUnit("t_local3","mvalue3",3600,false,false);
CookieUnit _cookie4=new CookieUnit("t_local4","mvalue4",3600,true,false);
Calendar c=Calendar.getInstance();
c.add(Calendar.MINUTE,30);

CookieUnit _cookie5=new CookieUnit("t_local5","v1",c.getTime(),false,true);
CookieHelper.addCookie(response,_cookie1);
CookieHelper.addCookie(response,_cookie2);
CookieHelper.addCookie(response,_cookie3);
CookieHelper.addCookie(response,_cookie4);
CookieHelper.addCookie(response,_cookie5);
%>
<html>
<head>
<title></title>
</head>
<body>

</body>
</html>


测试结果:



值得吐槽的是,secure属性的cookie不会通过http传送。

二、获取response对象里面已经设定好的cookie内容。

大家请先阅读http协议:
http://blog.sina.com.cn/s/blog_470ca93e010007sy.html


Java与Http协议

/article/4783929.html


HTTP 请求报头详解

/article/4561760.html


用HttpServletResponseWrapper获取jsp输出内容

http://blog.sina.com.cn/s/blog_407da9e90100s7e8.html
http://www.iteye.com/problems/41733
这里有一个坏消息告诉大家。。。servlet2.5规范似乎没有直接用的api可以直接获取response的header信息,cookie信息等等。。。那么如何办?

直接解析response的outputstream,然后用java解析http协议,建议自行包装response,解析(用过滤器)后替换掉原始response对象。首先大家看看http的应答形式:

Response Headersview parsed
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: t_local1=mvalue1; max-age=3600; Secure; HttpOnly
Set-Cookie: t_local2=mvalue2; max-age=3600; HttpOnly
Set-Cookie: t_local3=mvalue3; max-age=3600
Set-Cookie: t_local4=mvalue4; max-age=3600; Secure
Set-Cookie: t_local5=v1; expires=Sat, 8 Feb 2014 15:01:13 GMT; HttpOnly
Content-Type: text/html;charset=UTF-8
Content-Length: 82
Date: Sat, 08 Feb 2014 06:31:13 GMT


HTTP/1.1 200 OK
Server: nginx
Date: Sat, 08 Feb 2014 06:57:36 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=20
Vary: Accept-Encoding
X-Author: sq_zhuyi
Cache-Control: private, max-age=0, must-revalidate
Content-Encoding: gzip


HTTP/1.1 304 Not Modified
Server: nginx/0.7.68
Date: Sat, 08 Feb 2014 06:57:36 GMT
Last-Modified: Wed, 22 Jan 2014 10:43:22 GMT
Connection: keep-alive
Expires: Sat, 15 Feb 2014 06:57:36 GMT
Cache-Control: max-age=604800


HTTP/1.1 200 OK
Date: Sat, 08 Feb 2014 06:59:54 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: Keep-Alive
Vary: Accept-Encoding
Expires: Sat, 08 Feb 2014 06:59:51 GMT
Cache-Control: private
Server: BWS/1.1
BDPAGETYPE: 1
BDQID: 0x850a472f8dc8f1c6
BDUSERID: 0
Set-Cookie: BDSVRTM=0; path=/
Set-Cookie: H_PS_PSSID=1438_4261_4759; path=/; domain=.baidu.com
Content-Encoding: gzip


可以看到什么呢?就是除了有规范的头信息,还可以自定义不规范的信息。。

待续。

本来说要解析cookie的但是servlet2.0规范竟然没办法获得repsone的头文件这类,这么麻烦何必呢。。。不玩了,直接用nutz里面的动作链来设定session好了。
http://www.oschina.net/question/71435_60098
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: