1、session和cookieServlet知识2当用户第一次访问时,服务器会返回一个cookie给用户浏览器,第二次访问时,用户自己带着cookie过来,不需要再创建新的cookie。保存会话数据的两种技术: Cookie Cookie是客户端技术,服务器把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。 一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。 一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB
2、浏览器也可以存储多个WEB站点提供的Cookie。 浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。 如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。 注意,删除cookie时,path必须一致,否则不会删除 Session(失效时间一般是半小时,但是可以自己设置时间) Session是服务器
3、端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户
4、的session中取出该用户的数据,为用户服务。 Session和Cookie的主要区别在于: Cookie是把用户的数据写给用户的浏览器。 Session技术把用户的数据写到用户独占的session中。 Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。Session默认是浏览器进程,关闭了,原来的就没有了,要自己重写cookieid,那么再重新打开一个或者多个浏览器就会使用原来的session里的信息或者数据。IE8以下版本,打开一个浏览器就会创建一个新的session。以上版本就不会,打开任意浏览器都是共用一个sessio
5、n。Session和cookie都是用来保存用户数据的。怎么创建cookie?1.把用户的数据封装到cookie后2.通过response创建cookie3.服务器一看,response中有东西,会自动获取4.通过request的getCookies()方法拿到所有cookie(循环遍历)javax.servlet.http.Cookie类用于创建一个Cookie,response接口也中定义了一个addCookie方法,它用于在其响应头中增加一个相应的Set-Cookie头字段。 同样,request接口中也定义了一个getCookies方法,它用于获取客户端提交的Cookierequest
6、.getSession();/当执行到这句代码时,才会创建session,不是一开始访问网站就会创建session的实现是基于cookie的,用户第一次访问后,服务器即servlet会为用户创建一个session并且创建一个sessionid号(是用cookie实现),会回写一个cookieid给浏览器即用户,用户下次访问后,就带着这个cookieid来,直接取相应的session给对应的用户服务request.getSession(false);只获取session,不创建session,用于购物车结账时,体现高超的编程。虽然用这个request.getSession();也能实现以下代码实
7、现电子商务网站必写,含义是当用户打开多个浏览器,都是共用一个session。手工以cookie形式发sessionid,以解决关闭浏览器后,上次买的东西还在(哪里获取了session,以下代码就在哪里写)。String id=session.getId();Cookie cookie=new Cookie(JSESSIONID,id);/覆写sessionidcookie.setPath(/day07);/要一样,用httpwatch查看cookie.setMaxAge(30*60);/30 minutesresponse.addCookie(cookie);/回写给浏览器1. cookie案
8、例-显示用户上次访问网站的时间public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException out.print(清除上次访问时间); response.setCharacterEncoding(UTF-8); response.setContentType(text/html;charset=UTF-8); PrintWriter out = response.getWriter(); out.print(上次访问时间:); Coo
9、kie cookies=request.getCookies(); for(int i=0;cookies!=null & icookies.length;i+) if(cookiesi.getName().equals(lastAccessTime) long cookieValue=Long.parseLong(cookiesi.getValue(); Date date=new Date(cookieValue); out.print(date.toLocaleString(); Cookie cookie=new Cookie(lastAccessTime,System.current
10、TimeMillis()+); cookie.setMaxAge(1*30*24*3600);/ 以秒为单位,有效时间,不设置的话,是浏览器进程,关闭就没有了cookie cookie.setPath(/day07);/斜杠代表网站,设置cookie的有效路径,不设置的话,就是servlet的路径 response.addCookie(cookie)CookieDemo2代码如下:public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOExcep
11、tion Cookie cookie=new Cookie(lastAccessTime,System.currentTimeMillis()+);cookie.setMaxAge(0);/ 以秒为单位cookie.setPath(/day07);response.addCookie(cookie);/将cookie回写给浏览器 response.sendRedirect(/day07/servlet/CookieDemo1);/清除cookie之后,回到第一个servlet 2. Cookie案例-显示商品浏览历史纪录public class CookieDemo3 extends Http
12、Servlet 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.write(本站有如下商品:); Mapmap=Db.getAll(); fo
13、r(Map.Entry entry:map.entrySet() Book book=entry.getValue();out.print(+book.getName()+); /显示用户看过的商品 out.print(你曾经看过的商品); Cookie cookies=request.getCookies(); for(int i=0;cookies!=null & icookies.length;i+) if(cookiesi.getName().equals(bookHistory) String ids=cookiesi.getValue().split(,);/2,3,1 for(S
14、tring id:ids) Book book=(Book) Db.getAll().get(id); out.print(+book.getName()+); class Db private static Map map=new LinkedHashMap(); static map.put(1, new Book(1,JavaWeb开发,老k,一本好书); map.put(2, new Book(2,jdbc开发,老张,一本好书); map.put(3, new Book(3,spring开发,老li,一本好书); map.put(4, new Book(4,struts开发,老张,一本
15、好书); map.put(5, new Book(5,android开发,老bi,一本好书); public static Map getAll() return map; class Book private String id; private String name; private String author; private String description; public Book() super(); public Book(String id, String name, String author, String description) this.id = id; thi
16、s.name = name; this.author = author; this.description = description; public String getId() return id; public void setId(String id) this.id = id; public String getName() return name; public void setName(String name) this.name = name; public String getAuthor() return author; public void setAuthor(Stri
17、ng author) this.author = author; public String getDescription() return description; public void setDescription(String description) this.description = description; /显示详细信息的servletpublic class CookieDemo4 extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response) t
18、hrows ServletException, IOException /根据用户带过来的id,显示相应的详细信息 response.setCharacterEncoding(UTF-8); response.setContentType(text/html;charset=UTF-8); PrintWriter out = response.getWriter(); String id=request.getParameter(id); Book book=(Book)Db.getAll().get(id); out.write(book.getId()+); out.write(book.
19、getName()+); out.write(book.getAuthor()+); out.write(book.getDescription()+); /2.构建cookie,回写给浏览器; String cookieValue=buildCookie(id,request); Cookie cookie=new Cookie(bookHistory,cookieValue); cookie.setMaxAge(1*30*24*3600);/1 个月 cookie.setPath(/day07); response.addCookie(cookie); private String bui
20、ldCookie(String id, HttpServletRequest request) /bookHistory =null 1 1 /bookHistory=2,5,1 1 1,2,5 /bookHistory=2,5,4 1 1,2,5 /bookHistroy=2,5 1 1,2,5 / 假如列表最多3个 String bookHistroy=null; Cookie cookies=request.getCookies(); for(int i=0;cookies!=null & icookies.length;i+) if(cookiesi.getName().equals(
21、bookHistory) bookHistroy=cookiesi.getValue(); if(bookHistroy=null) return id; /if(bookHistroy.contains(id)不能这样 21,23 也包括1 List list=Arrays.asList(bookHistroy.split(,);/把数组转换成集合 LinkedList linkedlist=new LinkedList(list);/把list集合转换成linklist集合,linklist有这样的构造函数 if(list.contains(id) linkedlist.remove(id
22、); linkedlist.addFirst(id); else if(list.size()=3) linkedlist.removeLast(); linkedlist.addFirst(id); else linkedlist.addFirst(id); if(list.contains(id) linkedlist.remove(id); else if(list.size()=3) linkedlist.removeLast(); linkedlist.addFirst(id); StringBuffer sb=new StringBuffer(); for(String bid :
23、 linkedlist) sb.append(bid+,); return sb.deleteCharAt(sb.length()-1).toString(); 3.session案例:将用户的数据保存在session范围内SessionDemo1:public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException /response.setContentType(text/html); /PrintWriter out = respon
24、se.getWriter();HttpSession session=request.getSession();session.setAttribute(name, 洗衣机);String id=session.getId();Cookie cookie=new Cookie(JSESSIONID,id);/覆写sessionidcookie.setPath(/day07);/要一样,用httpwatch查看cookie.setMaxAge(30*60);/30 minutesresponse.addCookie(cookie);/回写给浏览器 /session.setMaxInactiveI
25、nterval(3600);/1小时 /session.invalidate();/摧毁/http:/localhost:8080/day07/servlet/sessionDemo1 以下是sessiondemo2,显示用户所购买的东西public class SessionDemo2 extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException response.setCharacterE
26、ncoding(UTF-8); response.setContentType(text/html;charset=utf-8); HttpSession session=request.getSession(); String name=(String) session.getAttribute(name); PrintWriter out = response.getWriter(); if(name!=null) out.write(name); else out.write(no buy); 以下是首页的servlet:第一次访问这个servletpublic void doGet(H
27、ttpServletRequest request, HttpServletResponse response) throws ServletException, IOException response.setCharacterEncoding(UTF-8); response.setContentType(text/html;charset=utf-8); PrintWriter out = response.getWriter(); request.getSession(); /URL重写技术,用于浏览器禁用cookie之后的技术。如果没有禁用cookie,第一次访问时,有2个cooki
28、eid, /但是,第二次访问时,url重写技术就没有带cookieid啦, /因为用户自己带了cookieid过来(没有禁用cookie,服务器就会回写一个cookieid给用户,用户再次访问时就会自己带过来cookieid) String url1 = response.encodeRedirectURL(/sessiondemo/servlet/SessionDemo1); String url2 = response.encodeRedirectURL(/sessiondemo/servlet/SessionDemo2); out.print(购买 ); out.print(结账 ); 4. 用session实现简单的购物(以下代码只用于浏览器没有禁用cookie的条件下)/首页,列出所有书public class