java对cookie的操作

本文详细介绍了Java中Cookie的基本操作,包括创建、读取、设置生命周期及路径等,并提供了具体的代码示例。此外,还讨论了跨浏览器下Set-Cookie的不同表现及如何设置HttpOnly属性以增强安全性。
摘要由CSDN通过智能技术生成

可以直接看最下面哦,最下面是推荐的

java对cookie的操作比较简单,主要介绍下建立cookie和读取cookie,以及如何设定cookie的生命周期和cookie的路径问题。

建立一个无生命周期的cookie,即随着浏览器的关闭即消失的cookie,代码如下

HttpServletRequest request  
HttpServletResponse response
Cookie cookie = new Cookie("cookiename","cookievalue");
response.addCookie(cookie);


下面建立一个有生命周期的cookie,可以设置他的生命周期

cookie = new Cookie("cookiename","cookievalue");
 
cookie.setMaxAge(3600);
 
//设置路径,这个路径即该工程下都可以访问该cookie 如果不设置路径,那么只有设置该cookie路径及其子路径可以访问
 
cookie.setPath("/");
response.addCookie(cookie);


下面介绍如何读取cookie,读取cookie代码如下

Cookie[] cookies = request.getCookies();//这样便可以获取一个cookie数组
for(Cookie cookie : cookies){
    cookie.getName();// get the cookie name
    cookie.getValue(); // get the cookie value
}

上面就是基本的读写cookie的操作。我们在实际中最好进行一下封装,比如增加一个cookie,我们关注的是cookie的name,value,生命周期,所以进行封装一个函数,当然还要传入一个response对象,addCookie()代码如下

public static void addCookie(HttpServletResponse response, String name,
String value, int maxAge) {
Cookie cookie = new Cookie(name, value);
cookie.setPath("/");
if (maxAge > 0)
cookie.setMaxAge(maxAge);
response.addCookie(cookie);
}


public static Cookie getCookieByName(HttpServletRequest request, String name) {
Map<String, Cookie> cookieMap = ReadCookieMap(request);
if (cookieMap.containsKey(name)) {
Cookie cookie = (Cookie) cookieMap.get(name);
return cookie;
} else {
return null;
}
}


private static Map<String,Cookie> ReadCookieMap(HttpServletRequest request){
Map<String,Cookie> cookieMap = new HashMap<String,Cookie>();
Cookie[] cookies = request.getCookies();
if(null!=cookies){
for(Cookie cookie : cookies){
cookieMap.put(cookie.getName(), cookie);
}
}
return cookieMap;

}

在这里看哦

Response Header Set-Cookie difference in cross browser

如果你项目中需要在server端把cookie写回client端,例如在JSP中写下面的代码: 
Java代码   收藏代码
  1. <%  
  2. Cookie cookie = new Cookie("testCookie""testValue");  
  3. cookie.setMaxAge(60);  
  4. cookie.setPath("/");  
  5. response.addCookie(cookie);  
  6. %>  

会有下面的信息在response header里面: 
Java代码   收藏代码
  1. Set-Cookie  testCookie=testValue; Expires=Wed, 02-Jul-2014 13:01:13 GMT; Path=/  


注意,IE下面 和 Chrome / Firefox下面对于“Set-Cookie”的处理是完全不同的,IE是base on client端的时间去计算cookie expire time; 
Chrome / Firefox 是base on server端的时间去计算cookie expire time! 

So,对于cookie expire过期时间要求很高的场景要特别当心了! 

以上面的代码为例:原意是要求cookie在60秒后过期,如果client端比她的local timezone的标准时间快more than 60秒,例如标准时间是10:00:00pm,但是client的system time是10:01:01pm;而server端是她的local timezone的标准时间,那么不管怎么地这个cookie在IE下都是立马过期的!! 


--- add some finding: 

response header 里的Expires 是指绝对过期时间(server时间),IE是拿这个绝对过期时间和client端的时间比;而正好相反:firefox和Chrome是拿她跟server端的时间比,So 造成了这种behavior上的差异!! 

可以在response header里面设置相对过期时间:“Max-Age”,能很好的解决这个问题: 

如下代码: 
Java代码   收藏代码
  1. response.addHeader("Set-Cookie""testCookie2=test2; Max-Age=60; Path=/");  

response header 如下: 
Java代码   收藏代码
  1. Set-Cookie  testCookie2=test2; Max-Age=60; Path=/  

因为她是相对时间,所以NO matter你的client端的时间是神马,都能确保在Max-Age时间里面能得到cookie!在IE/Firefox/Chrome下测试通过! 
shiro里面实现:
     maxAge是秒单位,0传删除,>0添加失效时间
private void appendExpires(StringBuilder sb, int maxAge) {
        if(maxAge >= 0) {
            sb.append("; ");
            sb.append("Max-Age").append("=").append(maxAge);
            sb.append("; ");
            Date expires;
            if(maxAge == 0) {
                expires = new Date(System.currentTimeMillis() - 86400000L);
            } else {
                Calendar formatted = Calendar.getInstance();
                formatted.add(13, maxAge);
                expires = formatted.getTime();
            }


            String formatted1 = toCookieDate(expires);
            sb.append("Expires").append("=").append(formatted1);
        }


    }
private static String toCookieDate(Date date) {
        TimeZone tz = TimeZone.getTimeZone("GMT");
        SimpleDateFormat fmt = new SimpleDateFormat("EEE, dd-MMM-yyyy HH:mm:ss z", Locale.US);
        fmt.setTimeZone(tz);
        return fmt.format(date);
    }


另一个博客介绍
将cookie设置成HttpOnly是为了防止XSS攻击,窃取cookie内容,这样就增加了cookie的安全性,即便是这样,也不要将重要信息存入cookie。
如何在Java中设置cookie是HttpOnly呢?
Servlet 2.5 API 不支持 cookie设置HttpOnly
http://docs.oracle.com/cd/E17802_01/products/products/servlet/2.5/docs/servlet-2_5-mr2/

建议升级Tomcat7.0,它已经实现了Servlet3.0
http://tomcat.apache.org/tomcat-7.0-doc/servletapi/javax/servlet/http/Cookie.html

但是苦逼的是现实是,老板是不会让你升级的。
那就介绍另外一种办法:
利用HttpResponse的addHeader方法,设置Set-Cookie的值
cookie字符串的格式:key=value; Expires=date(或Max-Age=毫秒数); Path=path; Domain=domain; Secure; HttpOnly
<p style="margin-top: 0px; margin-bottom: 10px; padding-top: 0px; padding-bottom: 0px;"><span style="line-height: 22px; font-size: 12px; font-family: 'comic sans ms';"><span class="com" style="color: rgb(136, 0, 0);">//设置cookie</span></span></p><p style="margin-top: 0px; margin-bottom: 10px; padding-top: 0px; padding-bottom: 0px;"><span style="line-height: 22px; font-size: 12px; font-family: 'comic sans ms';"><span class="com" style="color: rgb(136, 0, 0);">response.addHeader("Set-Cookie", "uid=112; Path=/; HttpOnly");</span></span></p><p style="margin-top: 0px; margin-bottom: 10px; padding-top: 0px; padding-bottom: 0px;"><span style="line-height: 22px; font-size: 12px; font-family: 'comic sans ms';">
</span></p><p style="margin-top: 0px; margin-bottom: 10px; padding-top: 0px; padding-bottom: 0px;"><span style="line-height: 22px; font-size: 12px; font-family: 'comic sans ms';"><span class="com" style="color: rgb(136, 0, 0);">//设置多个cookie</span></span></p><p style="margin-top: 0px; margin-bottom: 10px; padding-top: 0px; padding-bottom: 0px;"><span style="line-height: 22px; font-size: 12px; font-family: 'comic sans ms';"><span class="com" style="color: rgb(136, 0, 0);">response.addHeader("Set-Cookie", "uid=112; Path=/; HttpOnly");</span></span></p><p style="margin-top: 0px; margin-bottom: 10px; padding-top: 0px; padding-bottom: 0px;"><span style="line-height: 22px; font-size: 12px; font-family: 'comic sans ms';"><span class="com" style="color: rgb(136, 0, 0);">response.addHeader("Set-Cookie", "timeout=30; Path=/test; HttpOnly");</span></span></p><p style="margin-top: 0px; margin-bottom: 10px; padding-top: 0px; padding-bottom: 0px;"><span style="line-height: 22px; font-size: 12px; font-family: 'comic sans ms';">
</span></p><p style="margin-top: 0px; margin-bottom: 10px; padding-top: 0px; padding-bottom: 0px;"><span style="line-height: 22px; font-size: 12px; font-family: 'comic sans ms';"><span class="com" style="color: rgb(136, 0, 0);">//设置https的cookie</span></span></p><p style="margin-top: 0px; margin-bottom: 10px; padding-top: 0px; padding-bottom: 0px;"><span style="line-height: 22px; font-size: 12px; font-family: 'comic sans ms';"><span class="com" style="color: rgb(136, 0, 0);">response.addHeader("Set-Cookie", "uid=112; Path=/; Secure; HttpOnly");</span></span></p>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值