Cookie&Session
1. 会话技术
1.1 一次会话
用户打开浏览器访问一个页面开始,多次访问页面,到最后关闭浏览器的过程称为是一次会话
1.2 常用的会话技术
cookie:是一种客户端技术,将数据保存在浏览器的内存中。
session:是一种服务器技术,将数据保存在服务器端。
1.3 JSP执行原理
JSP本身就是一个Servlet.在执行的时候翻译成一个Servlet.将Servlet编译成一个class文件
1.4 JSP脚本
<%! %> :JSP声明. 翻译成Servlet的成员的东西.在声明当中定义 类,方法,变量. Servlet本身是单例的.定义成员属性的话容易引发线程安全问题.
<% %> :JSP脚本. 翻译成Servlet的service方法内部的东西. 在脚本中定义 类,变量,语句
<%= %> :JSP表达式. 翻译成Servlet的service方法内部的out.print()中的内容.
2. Cookie的使用
// 获得Cookie: Cookie[] request.getCookies(); // 向浏览器回写Cookie: response.addCookie(Cookie cookie); // 构造Cookie Cookie(String name,String value); //Cookie的分类 会话级别Cookie:默认的.关闭浏览器Cookie就会被销毁. 持久级别Cookie:将Cookie保存到本地的硬盘上. Cookie的API: * String getName(); * String getValue(); * void setDomain(String str); * 设置Cookie有效域名. * void setPath(String str); * 设置Cookie的有效路径. setPath(“/WEB11”); * void setMaxAge(int maxAge); * 设置Cookie的有效时长. setMaxAge(0); --- 删除持久的Cookie.(有效路径必须一致.) Cookie保存的时候一个浏览器上对Cookie的个数和大小都是由限制的. Cookie默认不能保存中文. * URLEncoder.encode(); * URLDecoder.decode();
案列演示:用户登录欢迎界面
/** 步骤一:在CountServlet中编写代码. 步骤二:获得从客户端带过来的所有的Cookie. 步骤三:从客户端带过来的所有的Cookie中查找指定名称的Cookie. 步骤四:判断是否是第一次访问: 如果没有查找到:就是第一次访问 显示欢迎 如果查找到:不是第一次访问 显示上次访问时间 步骤五:记录当前的时间,回写到浏览器. */ Cookie[] cookies = request.getCookies(); // Cookie // 调用工具查找指定名称的Cookie: Cookie cookie = CookieUtils.findCookie(cookies, "lastVisited"); // 判断: if(cookie == null){ // 第一次访问 response.getWriter().println("<h1>您是第"+count+"位登录成功的用户!欢迎登陆本网站!</h1>"); }else{ // 不是第一次 // 获得上次访问时间: long lastVisited = Long.parseLong(cookie.getValue()); Date date = new Date(lastVisited); response.getWriter().println("<h1>您是第"+count+"位登录成功的用户!上次访问时间为:"+date.toLocaleString()+"</h1>"); } long time = System.currentTimeMillis(); // 回写到浏览器: Cookie c = new Cookie("lastVisited",""+time); response.addCookie(c);
案例演示:浏览商品历史记录
/** * 商品浏览记录的Servlet: */ public class VisitServlet extends HttpServlet implements Serializable { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.接收参数: String id = request.getParameter("id"); // 2.查找指定名称的Cookie: Cookie[] cookies = request.getCookies(); Cookie cookie = CookieUtils.findCookie(cookies, "history"); // 3.判断是否是第一次浏览商品 if(cookie == null){ // 是第一次的话: Cookie c = new Cookie("history",id); c.setPath("/WEB11"); c.setMaxAge(7*24*60*60); response.addCookie(c); }else{ // 不是第一次 2,1 // 从Cookie中获得原来的存的ID的值. String value = cookie.getValue();// 2,1 // 因为数组 交换数组位置的时候比较麻烦的 将数组转成LinkedList: // Arrays.asList(value.split(",")); LinkedList<String> list = new LinkedList<String>(Arrays.asList(value.split(","))); // 判断商品是否浏览过. if(list.contains(id)){ // 说明之前浏览过该商品 // 2,1 ---> 1,2 list.remove(id); list.addFirst(id); }else{ // 说明之前没有浏览过该商品 // 2,1 ---> 3,2,1 if(list.size() >= 3){ // 超过3个 3,2,1 ---> 4,3,2 list.removeLast(); list.addFirst(id); }else{ // 没有超过3个 list.addFirst(id); } } // 将List中的值 转成一个字符串. StringBuffer sb = new StringBuffer(); for(String pid:list){ sb.append(pid+","); } // 删除最后一个逗号. 4,3,2, String v = sb.toString().substring(0, sb.length()-1); Cookie c = new Cookie("history",v); c.setPath("/WEB11"); c.setMaxAge(7*24*60*60); response.addCookie(c); } // 页面跳转 request.getRequestDispatcher("/product_info.htm").forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }
}
案例演示:删除浏览记录
public class ClearHistoryServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置Cookie有效路径和有效时长 设置0; Cookie[] cookies = request.getCookies(); Cookie cookie = CookieUtils.findCookie(cookies, "history"); // Cookie cookie = new Cookie("history",null); cookie.setPath("/WEB11"); cookie.setMaxAge(0); response.addCookie(cookie); // 页面跳转: // request.getRequestDispatcher("/productList.jsp").forward(request, response); response.sendRedirect("/WEB11/productList.jsp"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
3.session的使用
cookie保存在客户端,大小和数量有限制,而session保存在服务器端,没有限制。
生命周期:服务器启动的时候创建、服务器关闭的时候销毁。
作用范围:整个web应用.
HttpSession :私有的数据.登录用户的信息.
生命周期:服务器端第一次调用getSession()方法时候.才会创建一个session对象.
session销毁三种情况:session过期:默认过期时间30分钟;非正常关闭服务器:(正常关闭服务器 序列化到硬盘);调用session.invalidate();
案例演示:将商品添加到购物车
public class CartServlet extends HttpServlet imple...{ private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.接收商品的ID String id = request.getParameter("id"); String[] names = {"大毛衣","毛呢大衣"}; String name = names[Integer.parseInt(id)-1]; // 2.判断是否是第一次购物: // 获得session,从session中获得购物车: Map<String, Integer> cart = (Map<String, Integer>) request.getSession().getAttribute("cart"); if(cart == null){ // 第一次购物 // 创建购物车: cart = new LinkedHashMap<String,Integer>(); // 将商品和对应的数量存入到购物车. cart.put(name, 1); }else{ // 不是第一次购物 // 判断购物车中是否已经存在该商品. if(cart.containsKey(name)){ // 购物车中已经包含该商品 Integer count= cart.get(name); count++; cart.put(name, count); }else{ // 购物车中没有包含该商品 cart.put(name, 1); } } request.getSession().setAttribute("cart", cart); response.setContentType("text/html;charset=UTF-8"); response.getWriter().println("<h1><a href='/WEB11/productList.jsp'>继续购物</a> | <a href='/WEB11/cart.jsp'>去购物车结算</a></h1>"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
案列演示:清空购物车
public class ClearCartServlet extends HttpServlet implements....{ private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getSession().removeAttribute("cart"); response.sendRedirect("/WEB11/cart.jsp"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
浙公网安备 33010602011771号