Cookie & Session
Cookie
饼干,其实是一份小数据,是服务器给客户端,并且存储在客户端上的一份数据
应用场景
自动登录、浏览记录、购物车
为什么需要Cookie
http的请求时无状态的,即客户端与服务器在通讯的时候是无状态的,服务器不知道客户端以前是否来访过。
为了更好的用户体验,更好的交互[自动登陆],从公司层面讲,为了更好的手机用户习惯。
Cookie的使用
- 简单使用
- 添加和获取cookie
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); //创建cookie对象 Cookie cookie = new Cookie("cookie_name","cookie_value"); //给响应,添加一个cookie response.addCookie(cookie); //获取客户端带过来的cookie Cookie[] cookies = request.getCookies(); if(cookies != null) { for(Cookie c : cookies) { String cookieName = c.getName(); String cookieValue = c.getValue(); } } }
- 设置有效期
//关闭浏览器后,cookie就没有了--->在没有设置cookie有效期的情况下 //expiry: 有效 --->以秒计算 //正值:表示在这个数字过后,cookie将会消失 //负值:关闭浏览器后,cookie将会消失,默认值为-1 cookie.setMaxAge(60 * 60 * 24 * 7); //设置有效期为一周
- 常用方法
//可以给客户端返回多个cookie Cookie cookie1 = new Cookie("name","张三"); Cookie cookie2 = new Cookie("age","18"); //赋新的值 cookie.setValue(newValue); //用于只有请求指定的的域名,才会带上cookie cookie.setDomain(".servlet.com"); //只有访问该域名下的指定路径地址才会带cookie cookie.setPath("/CookieDemo");
- 添加和获取cookie
例子1: 获取上一次访问时间
1.判断账号是否正确
2.若正确,则获取cookie,但得到的是一个数组,我们要从数组里面找到我们想要的对象
3.如果找到的对象为空,表明是第一次登陆,那么要添加cookie
4.如果找到的对象不为空,表明不是第一次登录,更新cookie
- 从数组中获取需要的信息
public class CookieUtil { public static Cookie findCookie(Cookie[] cookies,String name){ if(cookies != null) { for(Cookie cookie : cookies) { if(name.equals(cookie.getName())){ return cookie; } } } return null; } }
- 逻辑判断
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //账号正确 if("admin".equals(userName) && "123".equals(password)) { //获取cookie Cookie [] cookies = request.getCookies(); //从数组里找到需要的cookie Cookie cookie = CookieUtil.findCookie(cookies, "last_time"); //如果是第一次登录,没有cookie if(cookie == null) { //创建cookie Cookie c = new Cookie("last_time",System.currentTimeMillis()+""); c.setMaxAge(60*60); response.addCookie(c); //显示界面 response.getWriter().write("欢迎您,"+userName); }else { //第二次登录,有cookie //获取上次登录时间 long lastVisitTime = Long.parseLong(cookie.getValue()); //显示界面 response.getWriter().write("欢迎您,"+userName+",上次来访的时间是:" + new Date(lastVisitTime)); //更新cookie,并返回 cookie.setValue(System.currentTimeMillis()+""); response.addCookie(cookie); } } }
例子2: 显示商品浏览记录
JSP 里面使用java代码
- Java Server Pager —> 最终会翻译成一个类,就是一个Servlet
- 定义一个全局变量
<%! int a = 99; %>
- 定义一个局部变量
<% int b = 999; %>
- 在jsp页面上,显示a 和 b的值
<%=a %> <%=b %>
- 定义一个全局变量
- 浏览记录的展示和删除
- jsp显示浏览记录
<% Cookie [] cookies = request.getCookies(); Cookie cookie = CookieUtil.fildCookie(cookies,"histoy"); //如果cookies是空,表明没有浏览任何商品 if(cookie == null){ %> <h2>您还没有浏览任何商品<h2> <% }else{ //不是空,表明有浏览记录,1#2#4 String[] ids = cookie.getValue().split("#"); for(String id : ids){ %> <img src="products/<%=id %>.jpg"> <% } } %>
- 获取浏览记录
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取当前用户浏览的商品id String id = request.getParameter("id"); Cookie[] cookies = request.getCookies(); Cookie cookie = CookieUtil.findCookie(cookies, "history"); //第一次浏览 if(cookie == null) { //1.响应返回cookie Cookie c = new Cookie("history",id); //设置有效期 c.setMaxAge(60*60*24); //设置只有在访问这个工程的时候才带cookie过来 c.setPath("/CookieDemo01"); response.addCookie(c); }else { //第二次 //1.获取以前的cookie,因为以前的cookie,包含了浏览记录 String ids = cookie.getValue(); //设置有效期 cookie.setMaxAge(60*60*24); //设置只有在访问这个工程的时候才带cookie过来 cookie.setPath("/CookieDemo01"); //2.让现在浏览的商品和以前浏览的商品,形成新的cookie cookie.setValue(id + "#" + ids); response.addCookie(cookie); } //3.跳转到指定页面 response.sendRedirect("Product_info.html"); }
- 清除浏览记录
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //清除cookie Cookie cookie = new Cookie("history",""); //设置立删除 cookie.setMaxAge(0); cookie.setPath("/CookieDemo01"); response.addCookie(cookie); //返回指定页面 response.sendRedirect("product_list.jsp"); }
- jsp显示浏览记录
Session
会话,Session是基于Cookie的一种会话机制。Cookie是服务器返回一小份数据客户端,并且存放在客户端。Session的数据存放在服务器。
- 常用API
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
//得到会话ID
String id = session.getId();
//存值
session.setAttribute(name, value);
//取值
session.getAttribute(name);
//移除值
session.removeAttribute(name);
}
- Sessio何时创建,何时销毁
- 创建
若果在Servlet里面调用了request.getSession()
- 销毁
session 是存放在服务器的内存中的一份数据(当然可以持久化,Redis),即关闭了浏览器,session也不会销毁。
- 销毁方法
- 1.关闭服务器
- 2.session会话时间过期,默认有效期:30分钟
例子3: 简单购物车
Servlet的实现
- product.jsp
<body>
<a href="CarServlet?id=0"><h3>Iphone7</h3></a><br>
<a href="CarServlet?id=1"><h3>小米6</h3></a><br>
<a href="CarServlet?id=2"><h3>三星Note8</h3></a><br>
<a href="CarServlet?id=3"><h3>魅族7</h3></a><br>
<a href="CarServlet?id=4"><h3>华为9</h3></a><br>
</body>
- CarServlet.java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//1.获取要添加到购物车的商品id
int id = Integer.parseInt(request.getParameter("id")); //0,1,2,3,4
String [] names = {"Iphone7","小米6","三星Note8","魅族7","华为9"};
//获取id对应的商品名
String name = names[id];
//2.获取过无车存放东西的session,Map<String,integer>
//把一个map对西乡存放到session里,并保证只保存一次
Map<String,Integer> map = (Map<String,Integer>)request.getSession().getAttribute("cart");
//如果session里面没有存放任何东西
if(map == null) {
//创建一个map
map = new LinkedHashMap<String,Integer>();
request.getSession().setAttribute("cart",map);
}
//3.判断购物车里有没有该商品
if(map.containsKey(name)) {
//在原来的值基础上 +1
map.put(name, map.get(name) + 1);
}else {
//没有买过该商品,设当前值为1
map.put(name, 1);
}
//4.输出界面(跳转)
response.getWriter().write("<a href='product_list.jsp'><h3>继续购物<h3><br>");
response.getWriter().write("<a href='cart.jsp'><h3>去购物车结算<h3>");
}
展示购物车内容
- cart.jsp
<body>
<h2>您的购物车商品如下:</h2>
<%
//1.先获取到map
Map<String,Integer> map = (Map<String,Integer>)session.getAttribute("cart");
//遍历map
if(map != null){
for(String key : map.keySet()){
int value = map.get(key);
%>
<h3>名称:<%=key %> 数量: <%=value %></h3>
<%
}
}
%>
</body>
清空购物车
- cart.jsp
<a href="ClearCartServlet"><h4>清空购物车</h4></a>
- ClearCartServlet.java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
//方法1:从session中移除某一个数据
session.removeAttribute("cart");
//方法2:强制干掉session,里面的所有数据将被清空
session.invalidate();
response.sendRedirect("cart.jsp");
}