zoukankan      html  css  js  c++  java
  • 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();

  • 相关阅读:
    父子进程 signal 出现 Interrupted system call 问题
    一个测试文章
    《淘宝客户端 for Android》项目实战 html webkit android css3
    Django 中的 ForeignKey ContentType GenericForeignKey 对应的数据库结构
    coreseek 出现段错误和Unigram dictionary load Error 新情况(Gentoo)
    一个 PAM dbus 例子
    漫画统计学 T分数
    解决 paramiko 安装问题 Unable to find vcvarsall.bat
    20141202
    js
  • 原文地址:https://www.cnblogs.com/-gongxue/p/14527947.html
Copyright © 2011-2022 走看看