会话—session

这篇随笔是上一篇的姊妹篇@_@!

session

      在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
Session和Cookie的主要区别在于:
1.Cookie是把用户的数据写给用户的浏览器。
   Session技术把用户的数据写到用户独占的session中。
2.Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。
注意,虽然代码相同,但不同浏览器从各自session得到各自的数据。

session实现原理

  服务器是如何做到一个session为一个浏览器的多次请求而服务  

       服务器创建session出来后,会把 session的id号,以cookie的形式回写给客户机,这样,只要客户机的浏览器不关, 去访问服务器时,都会带着session 的id号去,服务器发现客户机带session id过来了,就会使用内存中与之对应的session为之服务        

如何做到一个session为多个浏览器服务  

       服务器第一次创建session,程序员把session id号,手工以cookie的形式回送给浏览器,并设置cookie的有效期这样,即使用户的浏览器关了,开新浏览器时,还会带着session id找服务器,服务器从而就可以用内存中与之对应的session为第二个浏览器窗口服务。
       

应用:关掉IE后,再次打开IE,还能访问上次的session

 1 package com.yyz.session;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.ServletException;
 6 import javax.servlet.http.Cookie;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10 import javax.servlet.http.HttpSession;
11 
12 public class SessionDemo1 extends HttpServlet {
13 
14     public void doGet(HttpServletRequest request, HttpServletResponse response)
15             throws ServletException, IOException {
16         HttpSession session = request.getSession();
17         session.setAttribute("data", "abc");
18         String sessionid = session.getId();
19         Cookie cookie = new Cookie("JSESSIONID",sessionid);
20         cookie.setMaxAge(3600);
21         cookie.setPath("/test");
22         response.addCookie(cookie);
23     }
24 
25     public void doPost(HttpServletRequest request, HttpServletResponse response)
26             throws ServletException, IOException {
27         doGet(request,response);
28     }
29 
30 }
package com.yyz.session;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class SessionDemo2 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        HttpSession session = request.getSession();
        String data = (String)session.getAttribute("data");
        System.out .println(data);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
           doGet(request,response);
    }

}

 IE禁用Cookie后的session处理

解决方案:URL重写(把用户可能点的每一个超链接后面,都跟上用户的session id号)
•response. encodeRedirectURL(java.lang.String url)
•用于对sendRedirect方法后的url地址进行重写。
•response. encodeURL(java.lang.String url)
•用于对表单action和超链接的url地址进行重写

session对象的创建和销毁时机

     用户第一次request.getSession时创建
     session对象默认30分钟没有使用,则服务器会自动销毁session,
     用户在web.xml文件中手工配置session的失效时间
     用户可以手工调用session.invalidate方法,摧毁session

session常见应用 

1.使用Session完成用户登陆
2.利用Session防止表单重复提交
3.利用Session实现一次性验证码
   一次性验证码的主要目的就是为了限制人们利用工具软件来暴力猜测密码。服务器程序接收到表单数据后,首先判断用户是否填写了正确的验证码,只有该验证码与服务器端保存的验证码匹配时,服务器程序才开始正常的表单处理流程。密码猜测工具要逐一尝试每个密码的前题条件是先输入正确的验证码,而验证码是一次性有效的,这样基本上就阻断了密码猜测工具的自动地处理过程。
原文地址:https://www.cnblogs.com/yyz666/p/4060240.html