Java 会话技术 之 session
Session技术(存放在服务器 基于cookie(存储sessionId))
每个客户端 第一次会话请求时 创建独自的session域+JSESSIONID
服务端 响应 set-cookie:JSESSIONID:xxxxx 存入客户端
客户端 请求时 携带cookie:JSESSIONID:xxxxx去找对应的session域(内存)
客户端关闭 清除内存cookie / 保留硬盘cookie
客户端开启 再次访问 JSESSIONID没有 session域还在
Session对象的生命周期
创建:第一次执行request.getSession()时创建
销毁:
1)服务器(非正常)关闭时
2)session过期/销毁(不再请求,30分钟(tomcat默认)后销毁)
可以在WEB项目下WEB-INF/web.xml中进行配置
<session-config>
<session-timeout>30</session-timeout>
</session-config>
3)手动销毁session 退出时,删除session内数据 不用销毁
session.invalidate();
作用范围:
默认在一次会话中,一次会话中任何资源公用一个session对象
public class Servlet01 extends HttpServlet {
public void doGet(...) throws ServletException, IOException {
//获取每个客户端私有的session域(内存) 不存在 创建
HttpSession session=request.getSession();//获取/创建session域
session.setAttribute("goods", "iphone"); //存储数据
//String goods=(String)session.setAttribute("goods"); //取数据
//session.removeAttribute("goods"); //删除数据
String id=session.getId(); //获取JsessionId
response.getWriter().write("JsessionId:"+id); //网页输出id
}
public void doPost(...) {doGet(request, response);}
}
public class Servlet02 extends HttpServlet {//一次会话 任何资源共用session
public void doGet(...) throws ServletException, IOException {
HttpSession session=request.getSession();//获取session对象
String value=(String)session.getAttribute("name");//("goods")
response.setContentType("text/html;charset=utf-8");//解决乱码
response.getWriter().write("name:"+value);
}
public void doPost(...) {doGet(request, response);}
}
public class MyServlet extends HttpServlet {//session持久化
public void doGet(...) throws ServletException, IOException {
//获取session对象
HttpSession session=request.getSession();
session.setAttribute("name", "小野猪");
String id=session.getId();//获取JsessionId
//创建一个存储JsessionId的cookie对象
Cookie cookie=new Cookie("JSESSIONID",id);
cookie.setPath("/WEB0005");
cookie.setMaxAge(60*3);//JSESSIONID 存储时间
//发送cookie对象
response.addCookie(cookie);
response.getWriter().write("JSESSION:"+id);
}
public void doPost(...){doGet(request, response);}
}