Session解析及运行

    当浏览器访问服务器时:会将本地的Cookie发送过去,其中有一个键值位JSESSIONID=32位16进制数的值,服务器会根据该值去session池查找session对象,以此判断是否  

    为一次会话,即同一用户。

   当第一次访问服务器时不发送cookie,服务器会创建一个session对象,将其对应的key值(32位数),来创建新的cookie,当做JSESSIONID的值,写入浏览器。其中cookie对象

   的setAge默认为-1,告知浏览器不保存该cookie,当浏览器关闭时,cookie失效,一次会话结束。

   流程图:

  

获取session对象:

 request.getSession();

               利用session记录数据:

              request.getSession().setAttribute("name", "session--"+name);

              //把cookie技术和session技术联合起来做应用的一个例子---※功能:让用户在关闭浏览器之后,如果10分钟之内能够登录本站,还能访问到session中的信息
               //向客户端写一个key为"JSESSIONID"用value为sessionid的cookie,
               Cookie c = new Cookie("JSESSIONID",request.getSession().getId());
              c.setMaxAge(60*10);//10分钟后过期
             c.setPath( request.getContextPath() );//权限给本站内的所有网页或servlet
             response.addCookie(c);

            获取信息:

                request.getSession().getAttribute("name");

服务器之所以知道当前用户为同一个是由于JSESSIONID对应的session对象,服务器对session对象管理30分钟,未在请求则删除,也可以手动删除(即安全退出)

          //安全退出---只要让session对象无效就可以了
            request.getSession().invalidate();

session对象删除,即便浏览器发来cookie中有JSESSIONID,池中已经没有,会当做新用户重新写入cookie

用户禁用cookie时:浏览器对cookie只接受不发送,此时需要进行重写URL技术,使得地址url自带jsessionid参数来告知服务器为同一用户

   <h2>演示重写url技术---破解用户禁用cookie之后,我们session无效的问题</h2>
      <form action="<%= response.encodeURL("SaveServlet") %>" method="post">

网页验证码session验证:

public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("image/jpeg");
		int w = 60;
		int h=30;
		BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
		Graphics g = img.getGraphics();
		g.setFont(new Font("aa",Font.BOLD,18));
		Random r = new Random();
		int a = r.nextInt(10000);
		//将生成的验证码放入session---真值
		request.getSession().setAttribute("realCode", ""+a);
		g.drawString(""+a, 0, h);
		g.dispose();//把图形刷到img当中
		ImageIO.write(img, "JPEG", response.getOutputStream());
	}

String code = request.getParameter("code");//用户输入的
		String realCode = (String) request.getSession().getAttribute("realCode");//后台保存的真值
		if(code==null || !code.equals(realCode)){
			out.println("验证码输入错误");
		}
		//用一次,清一次!
		request.getSession().removeAttribute("realCode");//清除session中旧的验证

界面jsp:

<form action="session/LoginServlet" method="post">
         <img src="servlet/ImgServlet"/><input type="text" name="code"/><br/>
         <input type="submit" value="登录"/>
      </form>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值