什么是cookie
cookie是最常用的跟踪用户会话的方式。他是有服务器端生成的并发送给客户端浏览器的,浏览器会将其保存为某个目录下的文本文件。
当用户在浏览网站的时候,web服务器会将一些资料存放在客户端,这些资料包括用户在浏览器网站期间输入的文字或是一些选择记录。当用户下一次访问网站的时候,服务器端会先从客户端查看是否有保留下来的cookie信息,然后根据cookie内容呈现特定的页面内容给客户。cookie最典型的就是判定注册用户是否已经登录网站,用户可能会得到提示,是否保存状态以便再下一次进入系统时可以简化登录。另外cookie还会应用到最近浏览过的商品之类的业务处理中,用户在购物网站中浏览过不同的商品信息,都可以使用cookie进行保存方便用户快速定位到已浏览过的商品。
总结:cookie的作用主要表现在以下方面。
对特定对象的追踪,如访问者的访问次数,最后的访问时间,路径等。
统计网页浏览次数。
在cookie有效期内,记录用户登录信息。
实现各种个性化服务,如针对不同喜好的用户以不同的风格进行展示。
在JSP中使用cookie
1.创建cookie对象
Cookie newCookie=new Cookie(String name,String value);
解释:cookie类在javax.servlet.http包中,当jsp翻译成.java文件时,会自动导入javax.servlet.http包下的所有类。在jsp中,通过调用构造方法Cookie(String name,String value)创建新的cookie对象,其中:
name :用于代表cookie的名称。
value:用于表示改名称所对应的值。
2.写入cookie对象
我们知道response的常用的方法有一个addCookie()方法,在创建对象后,就使用response对象的addcookie方法实现写入cookie。
response.addCookie(newCookie);
cookie对象的方法有很多比如》
名称 | 说明 |
---|---|
void setMaxAge(int expiry) | 设置cookie的有效期,以秒为单位 |
void setValue(String value) | cookie创建之后,为cookie进行赋值 |
String getName() | 获取cookie的名称 |
String getValue() | 获取cookie的值 |
int getMaxAge() | 获取cookie的有效时间,以秒为单位 |
示例 在addCookie.jsp中添加cookie。
<%
response.addCookie(new Cookie("username","jake"));
response.addCookie(new Cookie("password","1234"));
response.sendRedirect("getCookies.jsp");
%>
3.读取cookie
我们在读取cookie的时候就需要使用requset的getCookies()方法,该方法将返回HTTP请求中的cookie对象数组,因此必须通过遍历的方式进行访问。
cookie时通过name、value的方法进行保存的,因此我们在遍历数组的时候我们要使用getName方法和getValue方法。
getCookies.jsp
<%
Cookie[] cookies = request.getCookies();
String user = "";
String pwd = "";
if(cookies != null){
for(int i=0; i<cookies.length; i++){
if(cookies[i].getName().equals("username")){
user = cookies[i].getValue();
}else if(cookies[i].getName().equals("password")){
pwd = cookies[i].getValue();
}
}
}
out.print("用户名:"+user+"密码:"+pwd);
%>
结果:
用户名:jake密码:1234
学会了cookie的存取值,下面进行验证sessionid是否已cookie的形式存储在客户端。首先通过访问jsp页面创建会话,然后从cookie中读取sessionid,比较与通过session对象的getid()方法取得的sessionid是否一样。
在create.jsp中
session.setAttribute("test", "hello");
response.sendRedirect("tow.jsp");
<%
out.print("sessionid" + session.getId());
out.print("<br/>");
Cookie[] cookies = request.getCookies();
if(cookies != null){
for(int i=0; i<cookies.length; i++){
out.print("cookie name:" + cookies[i].getName());
out.print("<br/>");
out.print("cookie value:" + cookies[i].getValue());
out.print("<br/>");
}
}
%>
结果:
sessionid11D5E5F5B8ABAAC8EEDC4CC1DF83B48B
cookie name:JSESSIONID
cookie value:11D5E5F5B8ABAAC8EEDC4CC1DF83B48B
可以看到cookie的值与sessionid的值时一致的,这也说明sessionid 被保存在cookie中了。
问题:
提问:如果我们在创建页面的时候不是使用response对象而是使用的getRequsetDispatch().forward(requset,respon)方法进行访问为何看不到cookie中的JSESSIONID?
回答:因为使用response对象的sendRedirect()方法是将页面进行重定向到一个新的地址,在请求getCookie.jsp之前,服务器已经对上一个请求作出了响应,在客户端写入了cookie。如果使用转发,到达getCookie.jsp前并没有返回响应,因为在客户端没有写入cookie。这时,只要通过浏览器再次访问getCookie.jsp页面(直接输入url),即可看到上次响应写入的cookie。
cookie与session作用域的对比
目前知道两张保存数据的信息一种是cookie一种是session,总结一下区别。
session作用域是在服务器端保存用户信息,cookie是在客户端保存用户信息。
session作用域中保存的数据是Objiect类型,cookie保存的值是String类型。
session作用域随会话的结束而将数据进行销毁,cookie可以长期保存在客户端。
cookie通常用于保存不重要的信息,重要的信息使用session进行保存。