介绍Cookie,我们先了解一下什么是会话
会话:
用户开一个浏览器用于查询相关信息,点击多个超链接,访问对应的多个web资源(需要查询的资源) ,然后关闭浏览器。整个过程可以看成一个会话。
会话过程中要解决的问题:
每个用户与服务器交互过程中,会有一些各自的数据,程序要想办法保存每个用户各自对应的数据,常见的是购物车系统,将用户添加的商品用于保存,方便结账
保存会话数据的两种技术:Cookie和Session
Cookie为保存会话数据提供可能,那么什么是Cookie? 所谓Cookie就是指程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户通过浏览器再去访问服务器中的web资源时,就会带着各自的数据区访问。从而达到web资源处理的就是用户各自的数据,可以看出cookie是将数据保存到浏览器,所以Cookie是一种客户端技术。
Cookie技术
Cookie的创建:javax.servlet.http.Cookie来创建一个Cookie,response接口中定义了一个addCookie方法,用于在其响应头中增加一个相应的set-Cookie头字段。而request定义了一个getCookies方法,它用于获取客户端提交的所有Cookie。
Cookie类的方法:
public Cookie(String name,String value) //创建Cookie
setMaxAge() //设置cookie的生命长度
setPath() //设置cookie的路径属性。客户端只能向以这个给定的路径String开头的路径返回cookie。
看一个例子:
//一个打印访问浏览器时间的servlet 练习cookie
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("UTF-8"); //指定服务器编码
response.setContentType("text/html;charset=UTF-8"); //控制浏览器编码
PrintWriter out = response.getWriter();
out.print("您上次访问的时间是:");
//获取用户的时间cookie
Cookie[] cookies = request.getCookies();
for(int i=0;cookies != null && i < cookies.length; i++)
{
if(cookies[i].getName().equals("LocalLastTime"))
{
Long value = Long.parseLong(cookies[i].getValue());
Date date = new Date(value);
out.print(date.toLocaleString());
}
}
//创建cookie 给用户回送最近的访问时间
Cookie cookie = new Cookie("LocalLastTime",System.currentTimeMillis()+"");
cookie.setMaxAge(24*3600); //cookie在浏览器保存的时间 一天
cookie.setPath("/servlet");
response.addCookie(cookie);
}
上面的servlet,实现功能是当访问该servlet时,会在浏览器打印你上次访问该servlet的时间,通过这个练习,学习Cookie的创建及其生命长度
另外一个例子:通过cookie实现,记录用户访问一个网站的记录
第一个Servlet:ClientCookie
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("ust-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//1.输出网站所有商品
out.print("本网站的所有书籍:<br/>");
Map<String,Book> map = Db.getAllData();
for(Map.Entry<String, Book> entry : map.entrySet()){
Book book = entry.getValue();
out.print("<a href='/servlet/servlet/CookieBrowse?id="+book.getId()+"'target='_blank'>"+book.getName()+"</a><br/>");
}
//2.显示用户曾经浏览过的所有的商品
out.print("<br/>用户曾经浏览的书籍:<br/>");
Cookie[] cookies = request.getCookies();
for(int i=0;cookies != null && i < cookies.length; i++){
if(cookies[i].getName().equals("bookHistory")){
String ids[] = cookies[i].getValue().split("\\,");
for(String id : ids){
Book book = (Book) Db.getAllData().get(id);
out.print(book.getName()+"<br/>");
}
}
}
}
class Db{
private static LinkedHashMap<String, Book> map = new LinkedHashMap<String,Book>();
static {
map.put("1", new Book("1","java","kermit","a good book"));
map.put("2", new Book("2","html","kermit","a good book"));
map.put("3", new Book("3","C","kermit","a good book"));
map.put("4", new Book("4","C++","kermit","a good book"));
map.put("5", new Book("5","XML","kermit","a good book"));
}
public static Map getAllData(){
return map;
}
}
class Book{
private String id;
private String name;
private String auth;
private String description;
public Book(String id, String name, String auth, String description) {
super();
this.id = id;
this.name = name;
this.auth = auth;
this.description = description;
}
set, get方法略。。。
}
第二个Servlet:BrowseCookie
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;utf-8");
PrintWriter out = response.getWriter();
//根据用户带过来的ID 显示书籍的详细信息
String id = request.getParameter("id");
Book book = (Book) Db.getAllData().get(id);
out.print("书籍详细信息:<br/>");
out.print(book.getId() + "<br>");
out.print(book.getName() + "<br/>");
out.print(book.getAuth() + "<br/>");
out.print(book.getDescription() + "<br/>");
//构建cookie 回写给浏览器
String cookieValue = bulidCookie(id,request); //得到访问记录
Cookie cookie = new Cookie("bookHistory",cookieValue); //创建名称为bookHistory的cookie 值为访问记录
cookie.setMaxAge(30*24*3600); //cookie保存在浏览器的时间为1个月
cookie.setPath("/servlet"); //工程路径
response.addCookie(cookie); //在响应中增加一个指定的cookie
}
private String bulidCookie(String id, HttpServletRequest request) {
//bookHistory=null 1 1 第一次访问 直接返回ID
//bookHistory=2,5,4 1 1,2,5 以前没有访问过 删除访问记录中的最后一个 将新访问的加在第一个
//bookHistory=2,5,1 1 1,2,5 以前有访问过 删除以前访问的 将新访问的加在第一个
//bookHistory=2,5 1 1.2,5 未访问过 且小于记录最大数3 直接将访问的ID 加在第一个
String bookHistory = null; //记录用户访问的书籍的所有ID号
Cookie[] cookies = request.getCookies();
for(int i=0;cookies!=null&&i<cookies.length;i++){
if(cookies[i].getName().equals("bookHistory")){
bookHistory = cookies[i].getValue();
}
}
if(bookHistory == null){ //第一次查看书籍
return id;
}
LinkedList<String> list = new LinkedList(Arrays.asList(bookHistory.split("\\,")));
if(list.contains(id)){ //访问记录最大为3个记录
//bookHistory=2,5,1 1 1,2,5 以前有访问过 删除以前访问的 将新访问的加在第一个
list.remove(id);
list.addFirst(id);
} else {
//bookHistory=2,5,4 1 1,2,5 以前没有访问过 删除访问记录中的最后一个 将新访问的加在第一个
if(list.size() >= 3){
list.removeLast();
list.addFirst(id);
} else {
//bookHistory=2,5 1 1.2,5 未访问过 且小于记录最大数3 直接将访问的ID 加在第一个
list.addFirst(id);
}
}
StringBuilder sb = new StringBuilder();
for(String ids : list){
sb.append(ids + ","); //用“,”将访问的书籍ID 分割开
}
return sb.substring(0,sb.length() - 1).toString(); //返回访问记录
}
自学笔记,多有不足!!!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)