一、Session的基本介绍
服务器端的会话技术(JSESSION:相当于一个标识符,一个用户只能有一个)
特点:存储到服务器端并且适用于私有数据。
在所有的会话跟踪技术中,HttpSession对象是最强大和最通用的。一个用户可以有且最多有一个HttpSession,并且不会被其它用户访问到。
1.在使用过程中的逻辑
1)从服务器端获取session,request.getSession()
如果能获取到session,将id记录下来,保存到浏览器端(依赖于cookie存在)
public Object getAttribute(String name:域对象中存储的数据名称)
如果获取不到session的id,需要创建一个session,将当前session的数据存储到服务器端。
public void setAttribute(String name,Object value)
2)session可以作为一个域对象
session域的范围仅仅在当前session域中有效(当前的用户)
2.session的生命周期
2.1 创建session create一个Session对象:getSession(true) HttpSession对象在用户第一次访问网站的时候自动创建。
public HttpSession getSession():直接从服务器端获取session数据,由request对象调用。
public HttpSession getSession(boolean create):如果参数为true,表示新建一个session会话;如果是false,同上。
2.2 给session域中添加一些数据 String/List/Map
存储数据的要求:
1)不同于URL重写、隐藏域或cookie,放入到HttpSession的值,是存储在内存中的。因此,不要往HttpSessino放入太多对象或大对象。尽管现代的Servlet容器在内存不够用的时候会将保存在HttpSessions的对象转储到二级存储上,但这样有性能问题,因此小心存储。
2)放到HttpSession中的值不限于String类型,可以是任意实现了java.io.Serializable的java对象(可以转为byte[],既可以放内存、文件、还可以放到数据库)。因为Servlet容器认为必要时会将这些对象放入文件或数据库中,尤其在内存不够用的时候。也可以将不支持序列化的对象放入HttpSession,但是这样的话,当Servlet容器视图序列化的时候会失败报错。
Session对象.setAttribute(String key,String value)
2.3 session的销毁 默认的超时时间在tomcat的配置目录中:web.xml:<session-config><session-timeout>30</session-timeout></session-config> default session timeout:30分钟
三种方式:
a 服务器非正常关闭
b 手动设置session的超时时间:public void setMaxInactiveInterval(int interval)-->参数为秒数,正整数
c 手动将session删除(常用) public void Invalidate():使此session会话无效。
3.Session的特点
A)可以存储任意类型的数据
B)适用于私有数据
C)存储大小无限制
二、Session的使用(两个案例)
案例一:加入购物车
关于加入购物车的逻辑:
分析:session技术
步骤分析:
1)当用户点击加入购物车,跳转到后台Servlet(Add2CartServlet)
跳转后台的时候,携带商品名称:name="xxx"
2)设置编码:utf-8
3)接收参数数据:name
4)从服务器端获取session,判断是否存在,需要构造一个购物车结构 :Map<String,Integer> 商品名称和商品数量
Map map=request.getSession().getAttribute("cart")
定义一个变量来记录商品数量:count
5)判断购物车是否为空
5.1 若为空
创建一个购物车 map=new HashMap();
count=1;
将购物车存储到session中:setAttribute("cart",map);
5.2 若不为空
先获取对应的商品数量count=map.get(name);
继续判断购物车中是否存在该商品
count=0,商品不存在-->count=1
如果商品存在,count++;
6)将数据存储在购物车中 put
7)提示用户
输出一个超链接:当前name加入购物车成功
提示用户:继续购物(超链接)
提示查看购物车:cart.jsp
1)表格(记录商品名称和商品数量)
2)从session域中获取购物车数据--->map
3)map为空,在浏览器中输出:亲,购物车为空。
4)map不为空
遍历map集合
输出tr/td
name/count。
案例二:清空购物车
1)在cart.jsp页面中创建一个超链接 <a href="/clearCart'>清空购物车</a>
2)在后面ClearCartServlet中完成逻辑
先获取session
手动删除session public void Invalidate():使此session会话无效。
3)重定向到cart.jsp页面
在EE项目中,加入购物车的逻辑分为两种情况判断:
1)登录 将商品数据存储到session(不同系统之间,session如何跨域?)
2)不登录 将商品数据存储到session。
package com.xunpu.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
/**
* 添加购物车
*/
@WebServlet(name = "Add2CartServlet")
public class Add2CartServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.设置编码
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
//2.接收前台传递来的参数name
String name = request.getParameter("name");
//3.获取session数据 购物车的结构Map<String,Integer>
Map<String,Integer> map = (Map) request.getSession().getAttribute("cart");
//定义一个count,表示商品的数量
int count=0;
//4.判断map是否为空
if(map==null){
//若为空,直接创建一个新的map集合
map=new HashMap();
count=1;
//再次将购物车添加到session域中
request.getSession().setAttribute("cart",map);
}else{
//若不为空,继续判断购物车是否包含该商品
//通过商品名称name获取商品数量
count=map.get(name);
if(count==0){
//不包含
count=1;
}else{
count++;
}
}
//将商品名称、商品数量添加到购物车
map.put(name,count);
//提示用户
writer.write("<b>已经将当前商品:"+name+"成功添加到购物车中 ");
writer.write("<a href='/product_list.jsp'>继续购物</a> ");
writer.write("<a href='cart.jsp'>查看购物车</a>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
package com.xunpu.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(name = "ClearCartServlet")
public class ClearCartServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1)获取session
HttpSession session =request.getSession();
//2)手动删除session
session.invalidate();
//3)重定向到cart.jsp页面中
response.sendRedirect("/cart.jsp");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}