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();

  • 相关阅读:
    【Android游戏开发之八】游戏中添加音频详解MediaPlayer与SoundPool的利弊以及各个在游戏中的用途!
    【Android游戏开发之九】(细节处理)触屏事件中的Bug解决方案以及禁止横屏和竖屏切换!
    【Android游戏开发之七】(游戏开发中需要的样式)再次剖析游戏开发中对SurfaceView中添加组件方案!
    前端要给力之:URL应该有多长?
    【Android游戏开发之三】剖析 SurfaceView ! Callback以及SurfaceHolder!!
    charactersFound方法中的陷阱
    前端要给力之:分解对象构造过程new()
    结合UIImageView实现图片的移动和缩放
    【Android游戏开发之一】设置全屏以及绘画简单的图形
    扩展BaseAdapter实现在ListView中浏览文件
  • 原文地址:https://www.cnblogs.com/-gongxue/p/14527947.html
Copyright © 2011-2022 走看看