您的位置:首页 > 编程语言 > Java开发

java对cookie的操作

2016-05-27 11:46 471 查看
可以直接看最下面哦,最下面是推荐的

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代码  


<%  

Cookie cookie = new Cookie("testCookie", "testValue");  

cookie.setMaxAge(60);  

cookie.setPath("/");  

response.addCookie(cookie);  

%>  

会有下面的信息在response header里面: 

Java代码  


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代码  


response.addHeader("Set-Cookie", "testCookie2=test2; Max-Age=60; Path=/");  

response header 如下: 

Java代码  


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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: