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

如何为cookie设置HttpOnly  


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

HTTP HEADER 详解


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

HTTP Cookie


http://www.cnblogs.com/hdtianfu/archive/2013/05/30/3108295.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协议


http://www.cnblogs.com/devinzhang/archive/2012/02/06/2340186.html

HTTP 请求报头详解

http://kuangbaoxu.iteye.com/blog/193352

用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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值