Session会话
Session会话
壶漏子 发表于4个月前
Session会话
  • 发表于 4个月前
  • 阅读 38
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

摘要: session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到

session,会话。当客户端(大多数都是浏览器)第一次访问服务器,严格地说是无session访问,服务器端就会为这次及以后的访问分配一个session 对象,用SESSIONID来标识。这个Session是保存在服务端的,有一个唯一标识。在服务端保存Session的方法很多,内存、数据库、文件都有。集群的时候也要考虑Session的转移,在大型的网站,一般会有专门的Session服务器集群,用来保存用户会话,这个时候 Session 信息都是放在内存的,使用一些缓存服务比如Memcached之类的来放 Session。

 

在以后的访问中,服务器端怎么知道是来自同一会话呢?通过Cookie。Cookie能够保存一些信息,并在下次访问时一并提交。每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie 来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID,以后每次请求把这个会话ID发送到服务器,就知道你是谁了。

当我们第一次访问服务器的时候服务器端会生成一个对应的session 并会自动的把这个sessionid添加到cookie中。这样我们第二次访问的时候浏览器会把这个cookie中的信息也带上,这样我们就能找到第一次访问时生成的那个session了。

当然cookie是可以被禁用的:也就是没法保存到cookie中。这时候应用URL重写技术来进行会话跟踪。重写url将JSESSIONID=XXXXX这个值添加到我们的请求路径中,这样做和添加到cookie中是同样的效果。url重写后的格式:http://localhost:8080/servlet/index.jsp;jsessionid=93C0C1C80DC217BBDA4E78BC2377359A要注意这里是使用‘;’而不是‘?’链接的。

 

session是有有效期的。

session的过期时间可以自己设定,当我们在创建session之后设置了session的有效时间后。即使我们关闭了浏览器窗口这个session 也不会立刻过期,他还是存在的直到他的过期时间。而过期时间是以该窗口最后一次访问服务器的时间为起始时间,而不是此一次的访问时间。

在web.xml 中,我们可以设置这个web应用的所有session的过期时间:

<session-config>

 <session-timeout>23</session-timeout>单位是分钟

  </session-config>

 

设定这一个session的过期时间:    setMaxInactiveInterval(20);设定时间单位为 秒!

 

 

非常典型的应用是自动登录。

把登录的用户信息保存到Session和Cookie中,在每次访问中自动使用。当然密码也可以,不过要加密的。

■Login:

            if (userCookie == null) {

                userCookie = new Cookie(IConsts.COOKIE_NAME_USER_ID, URLEncoder.encode(userId, "UTF-8"));

            }

            userCookie.setComment("Comment");

            userCookie.setDomain("192.168.11.32");

            userCookie.setPath("/teapot/");

            userCookie.setHttpOnly(false);

            userCookie.setSecure(false);

            userCookie.setVersion(1);

            userCookie.setMaxAge(60 * 60 * 24 * 365); // 1年



            resp.addCookie(userCookie);

            System.out.println("保存用户ID到Cookie.");



            HttpSession session = req.getSession();

            session.setAttribute(IConsts.COOKIE_NAME_USER_ID, user.getUserId());

            System.out.println("保存用户ID到Session.");

 

■Index:

        // 因为取得的是整个网页作用域的Cookie的值,所以得到的是个数组

        Cookie[] cookies = req.getCookies();



        String userId = null;

        for(int i = 0 ; i < cookies.length ; i++) {

            String name = cookies[i].getName();

            if (IConsts.COOKIE_NAME_USER_ID.equalsIgnoreCase(URLDecoder.decode(name, "UTF-8"))) {

                userId = cookies[i].getValue();

                HttpSession session = req.getSession();

                String usrId = (String) session.getAttribute(IConsts.COOKIE_NAME_USER_ID);

                if (userId != null) {

                    if (userId.equals(usrId)) {

                    } else {

                        // 与Session中保存的不一致,有可能客户端的是伪造的。

                        userId = null;

                    }

                }

                break;

            }

        }

 

■Logout:

        /* 删除Cookie */

        Cookie cookie = new Cookie(IConsts.COOKIE_NAME_USER_ID, null);

        cookie.setDomain("192.168.11.32");

        cookie.setPath("/teapot/");

        cookie.setMaxAge(0);

        resp.addCookie(cookie);

        System.out.println("从Cookie中删除用户ID");



        HttpSession session = req.getSession();

        String usrId = (String) session.getAttribute(IConsts.COOKIE_NAME_USER_ID);

        session.setAttribute(IConsts.COOKIE_NAME_USER_ID, null);

        System.out.println("从Session中删除用户ID");

        session.invalidate(); /* 将会话Session失效 */

 

(完)

 

共有 人打赏支持
粉丝 123
博文 173
码字总数 281345
×
壶漏子
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: