可以直接看最下面哦,最下面是推荐的
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
- <%
- Cookie cookie = new Cookie("testCookie", "testValue");
- cookie.setMaxAge(60);
- cookie.setPath("/");
- response.addCookie(cookie);
- %>
会有下面的信息在response header里面:
- 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”,能很好的解决这个问题:
如下代码:
- response.addHeader("Set-Cookie", "testCookie2=test2; Max-Age=60; Path=/");
response header 如下:
- Set-Cookie testCookie2=test2; Max-Age=60; Path=/
因为她是相对时间,所以NO matter你的client端的时间是神马,都能确保在Max-Age时间里面能得到cookie!在IE/Firefox/Chrome下测试通过!
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);
}
如何在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