0313 session
session技术是将数据存放在服务器的技术,就是每个客户端请求的时候,服务器就会根据客户端的用户自动开辟一块区域,并自动生成一个JSESSIONID,自动将这个id返回给客户端,然后客户端可以携带id去服务器访问属于自己的区域
原理
所以说session技术是基于cookIe的技术,所有类似cookie技术的功能都是自动的,所以不需要研究,我们只需要研究
(1)怎样获得属于本客户端的session对象(内存区域) 获取session对象
HttpSession session = request.getSession(); 通过这个方法
这个方法可以获取一个session对象,如果服务器端没有session对象,服务器就会创建一个session返回,如果有就直接将已经有的session返回
获取JSESSIONID方法 getId()
public class SessionServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取session对象 HttpSession session=request.getSession(); //获取JSEEIONID String JESSIONID=session.getId(); response.getWriter().write(JESSIONID); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
当我们关闭浏览器再重新打开访问
两次访问的id值是不一样 的。是因为关闭浏览器重新打开,这是第二个客户端访问,是感觉已经销毁了,其实不是,是客户端的JSESSIONID销毁了,但是在服务器的session域还是存在的
那要想我关闭浏览器,我再打开访问还是这个id值,那就要用到cookie技术去设置这个JSESSIONID在客户端存储的时间
代码展示
public class SessionServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取session对象 HttpSession session=request.getSession(); //获取JSEEIONID String JESSIONID=session.getId(); //创建cookie对象 Cookie cookie=new Cookie("JSESSIONID", JESSIONID); //设置持久化存储时间 cookie.setMaxAge(6*60); //设置携带路径 cookie.setPath("/WEB06"); //发送cookie response.addCookie(cookie); response.getWriter().write(JESSIONID); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
关闭浏览器再访问
(2)怎样向session中存取数据(session也是一个域对象)
在servlet01中存数据,在servlet02中取
代码展示
public class Servlet01 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取域 HttpSession session=request.getSession(); //存值 session.setAttribute("uname", "张三"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
public class Servlet02 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取域 HttpSession session=request.getSession(); //取值 String name=(String)session.getAttribute("uname"); //解决响应乱码 response.setContentType("text/html;charset=utf-8"); response.getWriter().write(name); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
先访问servelet01 再访问servlet02
此时servlet01是没有东西的
如果我们没访问servlet01,直接访问servlet02,就会发现空指针异常,因为域中没有数据
(3)Session对象的生命周期
第一次执行request.getSession()时创建
服务器(非正常)关闭时销毁
从不操作服务器端的资源开始计时 三十分钟自动销毁
可以设置时间长一点 那就在xml文件中设置一个标签
例:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
还可以手动销毁:session.invalidate();