JavaWeb中提供的对cookie的操作
- 简介
- 服务端创建Cookie对象,然后将Cookie添加到HTTP响应结果中
- 读取请求端浏览器的Cookie
- 设置/读取Cookie在客户端的有效期
- URL编码/解码
简介
Servlet API为Servlet访问Cookie提供了简单易用的接口。javax.servlet.http.Cookie
类用来表示Cookie,每个Cookie对象包含一个Cookie键名和Cookie值。
服务端创建Cookie对象,然后将Cookie添加到HTTP响应结果中
Cookie theCookie=new Cookie("username","Tom");//要存储在Cookie中的键值对,第一个参数是键名,第二个参数是键值。
response.addCookie(theCookie);
读取请求端浏览器的Cookie
- 获取Cookie:通过HttpServletRequest类的getCookies()方法返回一个Cookie数组,其中包含了HTTP请求中的所有Cookie。如果HTTP请求中没有任何Cookie,那么getCookies()方法返回null。
Cookie cookies[]=request.getCookies();
- 获取Cookie的键名:
对于每个Cookie对象,可调用getName()方法来获得Cookie的键名:
for(int i = 0; i < cookies.length; i++){out.println("Cookie name:"+cookies[i].getName());
}
- 获取Cookie的值:
对于每个Cookie对象,可调用getValue()方法来获得Cookie的值:
for(int i = 0; i < cookies.length; i++){out.println("Cookie value:"+cookies[i].getValue());
}
设置/读取Cookie在客户端的有效期
服务端Servlet向客户端写Cookie时,可以通过Cookie类的setMaxAge(int expiry)方法来设置Cookie在客户端的有效期,参数expiry以秒为单位:
- expiry大于零:指示浏览器在客户端硬盘上保存Cookie的时间为expiry秒。
- expiry等于零:指示浏览器删除当前Cookie。
- expiry小于零:指示浏览器不要保存Cookie到客户端硬盘。Cookie仅仅存在于当前浏览器进程的缓存中,当浏览器进程关闭,Cookie也就消失。
服务端Servlet读取客户端的Cookie,可以通过Cookie类的getMaxAge()方法来读取Cookie的有效期。以WelcomeServlet类利用Cookie来判断浏览器是否第一次访问服务器为例,比如创建WelcomeServlet.java,思路是WelcomeServlet类从HTTP请求中查找名为visitTime的Cookie,其表示上次访问自己的时间,如果找不到,就表明浏览器第一次访问自己;如果找到,就表明不是第一次访问。WelcomeServlet类会把当前时间作为名为visitTime的Cookie发送给浏览器,代码如下所示。
@WebServlet("/welcome")
public class WelcomeServlet extends HttpServlet {public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {Cookie[] cookies = request.getCookies();String lastTime=null;// 查找表示上次访问时间的Cookieif(cookies!=null){for (Cookie cookie : cookies) {if(cookie.getName().equals("visitTime")){// 需要对表示上次访问时间的Cookie值进行解码lastTime= URLDecoder.decode(cookie.getValue(),"UTF-8");}}}//此处缺少通过lastTime判断是否首次登录服务器的代码//添加本次访问的时间SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");String currTime = simpleDateFormat.format(new Date());// 对当前时间进行URL编码String currTimeEncode = URLEncoder.encode(currTime, "UTF-8");// 把经过URL编码的当前时间作为CookieCookie cookie = new Cookie("visitTime",currTimeEncode );// 向客户端的返回中添加Cookieresponse.addCookie(cookie);response.setContentType("text/plain;charset=UTF-8");PrintWriter out = response.getWriter();if(lastTime==null){out.println("欢迎光临本站");}else {out.println("欢迎再次光临本站,上次访问的时间为:"+lastTime);}out.close();}
}
URL编码/解码
Cookie中不支持冒号、短横线等特殊字符,为了把这些字符正确地保存到Cookie中,需要先把Cookie值进行URL编码后再保存:
// 对当前日期进行URL编码
String currTimeEncode = URLEncoder.encode(currTime, "UTF-8");
// 把经过URL编码的当前日期作为Cookie
Cookie cookie = new Cookie("visitTime",currTimeEncode );
// 向浏览器端写Cookie
response.addCookie(cookie);
WelcomeServlet在读取来自客户端的Cookie时,则需要进行URL解码:
lastTime= URLDecoder.decode(cookie.getValue(),"UTF-8");