对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.htmlhttp://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
相关文章推荐
- http相关知识 - (2)状态管理 - cookie
- JAVA中的异常处理相关知识
- Java处理http协议相关初步(一)——httpclient
- Java处理http协议相关初步(三)——线程池的使用分析
- HTTP网络连接相关知识整理(六):分发处理根异常
- Java中的http(网络处理)相关的库:HttpClient,HttpCore(转载)
- java处理大数的相关知识
- Java Web开发中用到的Http协议相关知识
- 【java程序员理解HTTP】【1】HTTP相关知识
- Java处理http协议相关初步(一)——httpclient
- Java处理http协议相关初步(二)——httpserver
- java进行https请求以及相关证书的生成
- 关于java对于大数处理的相关程序和用法
- idhttp与IdCookieManager处理登陆过程
- JAVA知识积累 给HttpClient添加Socks代理
- [Extjs6] 对gridpanel数据显示前对其进行相关的格式处理
- javaWeb-Servlet的继承体系和HttpServletRequest中常用的方法+HttpServletResponse对中文乱码的处理
- JavaWeb开发知识总结(HttpServletRequest,HttpServletResponse)
- java httpurlconnection 发送cookie时,cookie要在Post前发送
- JavaWeb-09(HttpServletRequest对象&会话管理之Cookie)