文档章节

Session会话

如比如比
 如比如比
发布于 2017/06/05 06:59
字数 1133
阅读 48
收藏 0

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失效 */

 

(完)

 

© 著作权归作者所有

共有 人打赏支持
如比如比
粉丝 124
博文 178
码字总数 286951
作品 0
日本
程序员
使用SESSION实现PHP会话的步骤

在PHP中可以使用SESSION来实现一个会话控制,那么具体要怎样去实现?一般来说,一个会话有如下几个基本的步骤: 1.开启一个会话 2.注册会话变量 3.使用会话变量 4.注销变量并销毁会话 当然,...

灵犀
2013/07/18
0
0
(三)Servlets Session会话

在Servlet中,会话的维持是通过HttoSession对象进行的,Web容器会自动为每一个Http会话都赋予一个唯一的"会话编号"(session 会话 ID)保存为每个 Web 客户端的 cookie,客户端的每次请求都会...

iborder
2016/09/05
3
0
负载均衡集群中的session解决方案

前言 在我们给Web站点使用负载均衡之后,必须面临的一个重要问题就是Session的处理办法,无论是PHP、Python、Ruby还是Java,只要使用服务器保存Session,在做负载均衡时都需要考虑Session的问...

a928154159
2017/09/13
0
0
会话级序列

在 12c 中现在可以创建新的会话级数据库序列来支持会话级序列值。这些序列的类型在有会话级的全局临时表上最为适用。会话级序列会产生一个独特范围的值,这些值是限制在此会话内的,而非超越...

whshurk
01/03
0
0
PHP session并发操作及session读写锁

今天我来谈谈所有的PHPer都熟悉的session。 Case 1.示例代码中分别以files,redis储存会话数据 2./session/setUserFile和/session/setUserRedis设置username,userid两个key,并sleep了3s 3....

BearCatYN
2015/07/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

io流

码农屌丝
11分钟前
0
0
SpringBoot基础篇之重名Bean的解决与多实例选择

更多Spring文章,欢迎点击 一灰灰Blog-Spring专题 当通过接口的方式注入Bean时,如果有多个子类的bean存在时,具体哪个bean会被注入呢?系统中能否存在两个重名的bean呢?如果可以,那么怎么...

小灰灰Blog
21分钟前
0
0
记录一次dubbo项目实战

一、案例说明 存在2个系统,A系统和B系统,A系统调用B系统的接口获取数据,用于查询用户列表。 二、环境搭建 安装zookeeper,解压(zookeeper-3.4.8.tar.gz)得到如下: 然后进入conf将zoo_s...

Java烂猪皮
25分钟前
0
0
拜托,别再问怎么深入学习分布式架构了!

由于分布式系统所涉及到的领域众多,知识庞杂,很多新人在最初往往找不到头绪,不知道从何处下手来一步步学习分布式架构。 本文试图通过一个最简单的、常用的分布式系统,来阐述分布式系统中...

Java架构资源分享
27分钟前
0
0
《netty入门与实战》笔记-05:心跳与空闲检测

本小节,我们一起探讨最后一个话题:心跳与空闲检测 首先,我们来看一下,客户端与服务端之间的网络会存在什么问题? 1. 网络问题 下图是网络应用程序普遍会遇到的一个问题:连接假死 连接假...

Funcy1122
32分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部