cookie简介
在登录某个网站时,比如登录163邮箱的网站,界面中有个十天免登陆的选项,先不勾选该选项,登录成功之后关闭浏览器或重启电脑,当再次访问163邮箱时会提示用户登录,这说明http协议是无状态的,在不同的请求之间是无法进行数据传递的。
而当勾选了十天免登陆的选项并登录成功之后,关闭浏览器或者重启电脑,之后再次访问163邮箱时就会自动登录了。这说明用户登录的一些信息保存到了该电脑的硬盘中(默认会存在浏览器的缓存中,可以设置保存在硬盘上),当访问163邮箱网站时,浏览器会将这些数据发送到服务器,从而实现了自动登录的功能,客户端电脑中用于保存这数据的资源,称为cookie。
用户在勾选十天免登陆的选项并登录成功之后,由服务器生成 Cookie,并将其封装到响应头中,以响应的形式发送给浏览器。浏览器接收到这个响应后,将 Cookie 保存到硬盘中。当浏览器再次发送同类请求后,在请求中会携带保存在硬盘的Cookie数据,发送到服务端,由服务器对解析该Cookie。
Cookie 技术并不是 JavaWeb 开发专属技术,而是属于 Web 开发的技术,是所有 Web 开发语言均支持的技术。Cookie 是由若干键值对构成,这里的键一般称为 name,值称为 value。 Cookie 中的键值对均为字符串。
总的来说cookie的作用就是在客户端存储一些数据,当浏览器再次请求某个服务器时会携带这些数据从而提供更好的用户体验。
删除cookie
通过火狐浏览器可以查看cookie,点击浏览器右上角的三个横杠–>选项–>隐私–>移除单个cookie,在这个界面中可以删除单个cookie也可以删除全部cookie,删除后,再次登录163网站时会提示输入用户名和密码。在其他浏览器中点击清空浏览器数据之后,也可以删除cookie。
注意:不同的web服务器在客户端所生成的cookie之间是不能相互访问和共享的。
cookie的禁用
浏览器是可以禁用 Cookie 的,即浏览器不接收服务器发送来的 Cookie。现在的很多网站,若浏览器禁用了 Cookie,则将无法访问。火狐浏览器中对于 Cookie 的禁用,是在火狐浏览器的“打开菜单/选项”的“隐私”标签中。不勾选“接受来自站点的 Cookie”,则表示禁用 Cookie。下面代码可以检测出浏览器是否禁用cookie:
1 if(navigator.cookieEnabled == true){ 2 alert("支持cookie"); 3 }else{ 4 alert("cookie已被禁用"); 5 }
cookie小知识
- 一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
- 浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
- 如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
- 删除cookie时,path必须一致,否则不会删除
JavaEE中的cookie技术
在javax.servlet.http包下有个名为Cookie的类,通过该类就可以向客户端设置cookie数据了。
cookie的默认绑定路径
创建一个servlet:
1 /** 2 * Cookie的默认绑定路径 3 * 4 */ 5 public class CookieTest01 extends HttpServlet { 6 private static final long serialVersionUID = 1L; 7 8 9 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 10 //创建cookie,第一个参数类似map的key,第二个参数类似map的value,不能存中文 11 Cookie cookie1 = new Cookie("username","monkey1024"); 12 Cookie cookie2 = new Cookie("password","123456"); 13 14 //将Cookie添加到相应中 15 response.addCookie(cookie1); 16 response.addCookie(cookie2); 17 } 18 19 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 20 doGet(request, response); 21 } 22 23 }
在web.xml中将上面的servlet的url-pattern设置为:/test/cookie01
访问该servlet时,可以通过fiddler中看到响应头中携带了之前设置的cookie信息。此时两个cookie与默认资源路径http://localhost:8080/07-03-cs/test 进行了绑定,也就是url-pattern中的上一级路径,当再次访问路径包含以上资源路径的url时,会自动将cookie放到请求头中向服务器发出请求。
设置绑定路径
cookie除了默认绑定之外我们还可以手动设置其绑定路径:
1 /** 2 * Cookie的手动绑定路径 3 * 4 */ 5 public class CookieTest02 extends HttpServlet { 6 private static final long serialVersionUID = 1L; 7 8 9 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 10 //创建cookie 11 Cookie cookie1 = new Cookie("username","monkey1024"); 12 Cookie cookie2 = new Cookie("password","123456"); 13 14 //手动设置绑定路径 15 cookie1.setPath(request.getContextPath() + "/aaa"); 16 cookie2.setPath(request.getContextPath() + "/aaa"); 17 18 //将Cookie添加到相应中 19 response.addCookie(cookie1); 20 response.addCookie(cookie2); 21 } 22 23 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 24 doGet(request, response); 25 } 26 27 }
设置cookie的有效时长
默认情况下, Cookie 是保存在浏览器的缓存中的,关闭浏览器后Cookie也就消失了。
开发者可以通过设置Cookie的有效时长,将Cookie写入到客户端硬盘文件中。
可以通过下面的方法设置有效时长
public void setMaxAge(int expiry)
其中expiry的单位为秒,整型。
- 大于 0,则表示要将 Cookie 写入到硬盘文件中;
- 小于 0,则表示 Cookie 存放在浏览器缓存中,与不设置时长等效;
- 等于 0,则表示 Cookie产生后直接失效。
1 /** 2 * Cookie的失效时间 3 * 4 */ 5 public class CookieTest03 extends HttpServlet { 6 private static final long serialVersionUID = 1L; 7 8 9 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 10 //创建cookie 11 Cookie cookie1 = new Cookie("username","monkey1024"); 12 Cookie cookie2 = new Cookie("password","123456"); 13 14 //手动设置绑定路径 15 cookie1.setPath(request.getContextPath() + "/aaa"); 16 cookie2.setPath(request.getContextPath() + "/aaa"); 17 18 //设置cookie的失效时间 19 cookie1.setMaxAge(60 * 60);//一小时 20 cookie2.setMaxAge(60 * 60 * 24);//一天 21 22 //将Cookie添加到相应中 23 response.addCookie(cookie1); 24 response.addCookie(cookie2); 25 } 26 27 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 28 doGet(request, response); 29 } 30 31 }
服务器端获取请求的cookie
在 HttpServletRequest 中有一个方法getCookies(),专门用于读取请求中所携带的 Cookie 数据,该方法的返回值类型是Cookie数组。
1 /** 2 * 接收客户端请求中携带的Cookie 3 * 4 */ 5 public class CookieReceive extends HttpServlet { 6 private static final long serialVersionUID = 1L; 7 8 9 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 10 Cookie[] cookie = request.getCookies(); 11 for(Cookie c : cookie){ 12 System.out.println("name="+c.getName()); 13 System.out.println("value="+c.getValue()); 14 } 15 } 16 17 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 18 doGet(request, response); 19 } 20 21 }
练习
1.实现获取用户上一次访问时间的功能,即当用户访问服务器,如果是非第一次访问的话,需要将上一次访问服务器的时间给用户显示出来。
1 /** 2 * 获取用户的最后访问时间 3 * 4 */ 5 public class LastVisitTime extends HttpServlet { 6 private static final long serialVersionUID = 1L; 7 8 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 9 response.setContentType("text/html;charset=UTF-8"); 10 PrintWriter out = response.getWriter(); 11 //获取客户端的所有Cookie对象 12 Cookie[] cookies = request.getCookies(); 13 /* 14 //如果等于null则说明是第一次访问 15 for (int i = 0;cookies!=null && i < cookies.length; i++) { 16 if("lastVisitTime".equals(cookies[i].getName())){//找到name为lastVisitTime的cookie 17 long l = Long.parseLong(cookies[i].getValue());//把Cookie中的value取出 18 out.write("你的最后访问时间为:"+new Date(l).toLocaleString());//yyyy-MM-dd 19 } 20 } 21 22 //创建cookie, 23 Cookie cookie = new Cookie("lastVisitTime",System.currentTimeMillis()+""); 24 */ 25 // 如果等于null则说明是第一次访问 26 if (cookies == null) { 27 out.write("第一次访问"); 28 } else { 29 for (int i = 0; i < cookies.length; i++) { 30 if ("lastVisit".equals(cookies[i].getName())) {// 找到name为lastVisitTime的cookie 31 out.write("你的最后访问时间为:" + cookies[i].getValue()); 32 } 33 } 34 } 35 36 //使用jdk8中的LocalDateTime 37 LocalDateTime currentTime = LocalDateTime.now(); 38 //不能有空格 39 //DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); 40 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd/HH:mm:ss"); 41 // 创建cookie 42 Cookie cookie = new Cookie("lastVisit", currentTime.format(formatter)); 43 //设置cookie的有效时间,单位是秒 44 cookie.setMaxAge(60*60);//保存时间为1小时 45 //把cookie信息写回到客户端 46 response.addCookie(cookie); 47 48 } 49 50 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 51 doGet(request, response); 52 }
2.实现十天内免登陆的功能,当用户成功登陆后,十天内可以自动登录。用户名和密码直接写在代码中即可。
1 /** 2 * 用户登录 3 */ 4 public class LoginServlet extends HttpServlet { 5 private static final long serialVersionUID = 1L; 6 7 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 8 response.setContentType("text/html;charset=UTF-8"); 9 PrintWriter out = response.getWriter(); 10 request.setCharacterEncoding("UTF-8"); 11 12 String userName = ""; 13 String password = ""; 14 //得到客户端保存的Cookie数据 15 Cookie[] cookies = request.getCookies(); 16 for (int i = 0;cookies!=null && i < cookies.length; i++) { 17 if("userName".equals(cookies[i].getName())){ 18 userName = cookies[i].getValue(); 19 } 20 if("password".equals(cookies[i].getName())){ 21 password = cookies[i].getValue(); 22 } 23 } 24 25 //与cookie中的用户名和密码做匹配 26 if("admin".equals(userName) && "123456".equals(password)){ 27 out.write("登录成功!"); 28 }else{ 29 out.write("<form action='"+request.getContextPath()+"/servlet/doLogin' method='post'>"); 30 out.write("用户名:<input type='text' name='userName' /><br/>"); 31 out.write("密码:<input type='password' name='password'/><br/>"); 32 out.write("<input type='checkbox' name='remember' />十天免登陆<br/>"); 33 out.write("<input type='submit' value='登录'/><br/>"); 34 out.write("</form>"); 35 36 } 37 38 39 } 40 41 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 42 doGet(request, response); 43 } 44 45 }
1 /** 2 * 登录 3 */ 4 public class DoLoginServlet extends HttpServlet { 5 private static final long serialVersionUID = 1L; 6 7 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 8 request.setCharacterEncoding("UTF-8"); 9 response.setContentType("text/html;charset=UTF-8"); 10 PrintWriter out = response.getWriter(); 11 //获取表单数据 12 String userName = request.getParameter("userName"); 13 String password = request.getParameter("password"); 14 String remember = request.getParameter("remember"); 15 16 Cookie cookie1 = new Cookie("userName", userName); 17 Cookie cookie2 = new Cookie("password", password); 18 cookie1.setPath("/"); 19 cookie2.setPath("/"); 20 if("admin".equals(userName)&&"123456".equals(password)){ 21 if(remember!=null){ 22 cookie1.setMaxAge(60 * 60 * 240);//设置Cookie的有效保存时间为十天 23 cookie2.setMaxAge(60 * 60 * 240); 24 response.addCookie(cookie1);//将Cookie写回到客户端 25 response.addCookie(cookie2); 26 } 27 out.write("登录成功!"); 28 }else{ 29 out.write("登录失败!"); 30 //设置2秒跳到重新登录 31 response.setHeader("refresh", "2;url="+request.getContextPath()+"/servlet/login"); 32 } 33 34 } 35 36 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 37 doGet(request, response); 38 } 39 40 }
session简介
在WEB开发中,服务器可以为每个客户端浏览器创建一个session对象,默认情况下一个浏览器独占一个session对象。在实际应用当中,服务器程序可以把一些敏感数据写到用户浏览器独占的session中可以提高安全性,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
session和cookie的主要区别是:
- session存储在服务器端
- cookie存储在客户端
JavaEE中的session
在javax.servlet.http包下有个HttpSession类,通过该类就可以操作session。
获取Session对象的方式:通过调用request对象中的getSession()方法就可以获取Session对象了,不需要手动new创建。
Session中常用的方法:
- public void setAttribute(String name, Object value)
该方法用于向 Session 的中放入一个键值对。 - public Object getAttribute(String name)
该方法用于从 Session 中根据名字获取值。 - public void removeAttribute(String name)
该方法用于从Session中删除数据。代码示例:
创建一个名为SessionTest01的servlet用来接收用户传入的数据并放到session对象中:1 package com.monkey1024.servlet.session; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 import javax.servlet.http.HttpSession; 10 11 /** 12 * session 13 */ 14 public class SessionTest01 extends HttpServlet { 15 private static final long serialVersionUID = 1L; 16 17 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 18 19 String name = request.getParameter("name"); 20 //得到一个HttpSession对象 21 HttpSession session = request.getSession(); 22 session.setAttribute("name", name); 23 24 } 25 26 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 27 doGet(request, response); 28 } 29 30 }
创建一个名为SessionTest02的servlet从session对象中取得之前用户传入的数据:
1 package com.monkey1024.servlet.session; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 import javax.servlet.http.HttpSession; 10 11 /** 12 * session 13 */ 14 public class SessionTest02 extends HttpServlet { 15 private static final long serialVersionUID = 1L; 16 17 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 18 response.setContentType("text/html;charset=UTF-8"); 19 //得到一个HttpSession对象 20 HttpSession session = request.getSession(); 21 String name = (String) session.getAttribute("name"); 22 System.out.println("你的姓名是:" + name); 23 24 25 } 26 27 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 28 doGet(request, response); 29 } 30 31 }
首先访问第一个servlet,在url中写上name的数据:
localhost:8080/07-03-cs/session01?name=monkey
再访问第二个servlet:
localhost:8080/07-03-cs/session02
在eclipse控制台中可以看到第一个servlet中传入的name数据再打开另外一个浏览器直接访问第二个servlet:
localhost:8080/07-03-cs/session02
此时控制台中打印的结果是null
这说明Web开发中的 Session机制会为每个浏览器分配了一个 Session。即一个浏览器一个 Session,不同的Session之间的数据不能共享。
session工作原理
服务器会为每个浏览器分配一个session,每个浏览器只能访问自己的session对象,可http协议是无状态的,那服务器是如何识别这些浏览器的呢?
服务器对Session对象是以Map的形式进行管理的,每创建一个session对象,服务器都会向该Map中的 key放入一个32位长度的随机串,这个随机串称为JSessionID, 之后将该session对象的引用放入到map的value中。
session放入到Map之后,服务器还会自动将”JSESSIONID”作为 name,32位长度的随机串作为value,放到cookie中并发送到客户端。该cookie会默认放到浏览器的缓存中,只要浏览器不关闭就一直存在。
当浏览器第二次向服务器发送请求时会携带该cookie,服务器接收到之后会根据JSessionID从Map中找到与之对应的session对象。
Session的失效
若某个Session 在指定的时间范围内一直未被访问,那么 Session 将超时,即将失效。在 web.xml 中可以通过标签设置 Session 的超时时间,单位为分钟。默认 Session 的超时时间为 30 分钟。这个时间并不是从 Session 被创建开始计时的生命周期时长,而是从最后一次被访问开始计时,在指定的时长内一直未被访问的时长。
1 <!-- 设置失效时间为60分钟 --> 2 <session-config> 3 <session-timeout>60</session-timeout> 4 </session-config>
可以在servlet中调用session中的invalidate()方法使session失效:
1 //使session失效 2 session.invalidate();
数据空间范围对比
在 JavaWeb 编程的 API 中,存在三个可以存放数据的空间范围对象,这三个对象中所
存储的数据作用范围,由大到小分别为:
ServletContext—>HttpSession—>HttpServletRequest
ServletContext,即application,置入其中的数据是整个web应用范围的,可以完成跨会话
共享数据。
HttpSession,置入其中的数据是会话范围的,可以完成跨请求共享数据。
HttpServletRequest,置入其中的数据是请求范围的,可以完成跨 Servlet 共享数据。
但这些 Servlet 必须在同一请求中。
对于这三个域属性空间对象的使用原则是,在可以保证功能需求的前提下,优先使用小
范围的。这样不仅可以节省服务器内存,还可以保证数据的安全性。
使用web中的session来实现网站购物车功能
1 创建一个用于初始化图书数据的DBUtil工具类(实际应用中会从数据库中读取): 2 3 package com.monkey1024.servlet.util; 4 5 import java.util.HashMap; 6 import java.util.Map; 7 8 import com.monkey1024.servlet.bean.Book; 9 10 /** 11 * 初始化图书数据 12 * 13 */ 14 public class DBUtil { 15 private static Map<String, Book> books = new HashMap<String, Book>(); 16 17 static{ 18 books.put("1", new Book("1", "java快速入门", 20, "马化腾")); 19 books.put("2", new Book("2", "java进阶之路", 30, "李彦宏")); 20 books.put("3", new Book("3", "java高手速成", 40, "马云")); 21 books.put("4", new Book("4", "java编程之道", 50, "雷军")); 22 } 23 24 //取得全部图书 25 public static Map<String, Book> findAllBooks(){ 26 return books; 27 } 28 29 /** 30 * 根据id查找指定的书 31 * @param id 32 * @return 33 */ 34 public static Book findBookById(String id){ 35 return books.get(id); 36 } 37 }
创建用户展示书籍的servlet:
1 package com.monkey1024.servlet.session; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 import java.util.Map; 6 7 import javax.servlet.ServletException; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 12 import com.monkey1024.servlet.bean.Book; 13 import com.monkey1024.servlet.util.DBUtil; 14 15 /** 16 * 展示书籍 17 */ 18 public class ShowBookServlet extends HttpServlet { 19 private static final long serialVersionUID = 1L; 20 21 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 22 response.setContentType("text/html;charset=UTF-8"); 23 PrintWriter out = response.getWriter(); 24 out.print("全部java书籍:<br/>"); 25 26 //取得全部书籍 27 Map<String, Book> books = DBUtil.findAllBooks(); 28 29 //生成html 30 for (Map.Entry<String, Book> book : books.entrySet()) { 31 String url1 = request.getContextPath()+"/AddCart?id="+book.getKey(); 32 out.print("<a href='"+url1+"' >"+book.getValue().getName()+"</a><br/>"); 33 } 34 String url2 = request.getContextPath()+"/ShowCart"; 35 out.print("<a href='"+url2+"'>查看购物车</a> <br/>"); 36 37 String url3 = request.getContextPath()+"/ClearCart"; 38 out.print("<a href='"+url3+"'>清空购物车</a> <br/>"); 39 } 40 41 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 42 doGet(request, response); 43 } 44 45 }
创建向购物车中添加数据的servlet:
1 package com.monkey1024.servlet.session; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 import java.util.HashMap; 6 import java.util.List; 7 import java.util.Map; 8 9 import javax.servlet.ServletException; 10 import javax.servlet.http.HttpServlet; 11 import javax.servlet.http.HttpServletRequest; 12 import javax.servlet.http.HttpServletResponse; 13 import javax.servlet.http.HttpSession; 14 15 import com.monkey1024.servlet.bean.Book; 16 import com.monkey1024.servlet.util.DBUtil; 17 18 /** 19 * 向购物车中添加书籍 20 */ 21 public class AddCartServlet extends HttpServlet { 22 private static final long serialVersionUID = 1L; 23 24 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 25 response.setContentType("text/html;charset=UTF-8"); 26 PrintWriter out = response.getWriter(); 27 //取得书籍的id 28 String id = request.getParameter("id"); 29 //得到session对象 30 HttpSession session = request.getSession(); 31 //从session中取出map,其中key存储图书编号,value存储数量 32 Map<String,Integer> map= (Map<String,Integer>)session.getAttribute("ShoppingCart"); 33 if(map==null){ 34 map = new HashMap<String,Integer>(); 35 } 36 //如果是null则说明还未向购物车中添加过 37 if(map.get(id) == null){ 38 map.put(id, 1); 39 }else{ 40 //向购物车中书籍的数量加1 41 map.put(id, map.get(id) + 1); 42 } 43 44 //把map放回到session中 45 session.setAttribute("ShoppingCart", map); 46 out.print("购物车添加成功!"); 47 } 48 49 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 50 doGet(request, response); 51 } 52 53 }
创建用于展示购物车中数据的servlet:
1 package com.monkey1024.servlet.session; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 import java.util.List; 6 import java.util.Map; 7 8 import javax.servlet.ServletException; 9 import javax.servlet.http.HttpServlet; 10 import javax.servlet.http.HttpServletRequest; 11 import javax.servlet.http.HttpServletResponse; 12 import javax.servlet.http.HttpSession; 13 14 import com.monkey1024.servlet.bean.Book; 15 import com.monkey1024.servlet.util.DBUtil; 16 17 /** 18 * 展示购物车中的数据 19 */ 20 public class ShowCartServlet extends HttpServlet { 21 private static final long serialVersionUID = 1L; 22 23 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 24 response.setContentType("text/html;charset=UTF-8"); 25 PrintWriter out = response.getWriter(); 26 out.print("购物车有以下商品:<br/>"); 27 HttpSession session = request.getSession(); 28 //得到session对象 29 Map<String,Integer> books = (Map<String,Integer>)session.getAttribute("ShoppingCart"); 30 if(books==null){ 31 out.print("购物车为空"); 32 response.setHeader("refresh", "2;url="+request.getContextPath()+"/ShowBook"); 33 return; 34 } 35 for (Map.Entry<String, Integer> book : books.entrySet()) { 36 Book b = new Book(); 37 b = DBUtil.findBookById(book.getKey()); 38 out.write("名称:" + b.getName() + ",数量:" + book.getValue() + "<br/>"); 39 } 40 } 41 42 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 43 doGet(request, response); 44 } 45 46 }
创建用于清空购物车的servlet:
1 package com.monkey1024.servlet.session; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 import javax.servlet.http.HttpSession; 11 12 /** 13 * 清空购物车 14 */ 15 public class ClearCartServlet extends HttpServlet { 16 private static final long serialVersionUID = 1L; 17 18 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 19 response.setContentType("text/html;charset=UTF-8"); 20 PrintWriter out = response.getWriter(); 21 HttpSession session = request.getSession(); 22 session.removeAttribute("ShoppingCart"); 23 out.write("购物车清空成功!"); 24 } 25 26 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 27 doGet(request, response); 28 } 29 30 }