文档章节

Session会话

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

精选30+云产品,助力企业轻松上云!>>>

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

 

(完)

 

如比如比
粉丝 126
博文 178
码字总数 286951
作品 0
日本
程序员
私信 提问
加载中
请先登录后再评论。
$_SESSION和session_start示例

$_SESSION $HTTPSESSIONVARS [已弃用] $SESSION -- $HTTPSESSION_VARS [已弃用] — Session 变量 说明 当前脚本可用 SESSION 变量的数组。更多关于如何使用的信息,参见 Session 函数 文档。...

Amamatthew
2014/10/05
28
0
PHP实战之Session会话控制

目录 1. 前言 2. SESSION的使用 2.1 session简介及工作原理 2.2开启会话session_start() 2.3设置会话$_SESSION 2.4销毁session 3. session实战演示 3.1使用session保存验证码 4.自定义会话管...

六道木
07/04
8
0
Servlet Session 

Servlet Session HTTP 是一种"无状态"协议,这意味着每次客户端检索网页时,客户端打开一个单独的连接到 Web 服务器,服务器会自动不保留之前客户端请求的任何记录。 但是仍然有以下三种方式...

村长大神
2016/09/12
40
1
PHP Session 常用的函数

我们在前面的文章里面讲到session的原理和最佳实践,感到意犹未尽。现在再来聊下PHP Session用到的几个相关的函数。 session_start() session_start() 会创建新会话或者重用现有会话。 如果通...

osc_11wdnyu0
2018/03/28
7
0
php中如何删除和销毁Session

当使用完一个 Session 变量后,可以将其删除;当完成一个会话以后,也可以将其销毁。如果用户想退出 Web 系统,就需要为他提供一个注销的功能,把他的所有信息在服务器中销毁。 删除会话的主...

osc_ui6dytbk
01/16
7
0

没有更多内容

加载失败,请刷新页面

加载更多

丛书【数据库面试笔试宝典】已在京东、淘宝、天猫等各大电子商城销售

丛书【数据库面试笔试宝典】已在京东、淘宝和天猫开售,一共5本,丛书豆瓣连接:https://book.douban.com/series/46055。 数据库面试笔试系列书籍一共包含5本,分别为《Oracle程序员面试笔试...

小麦苗
06/30
29
0
代码优化-多态代替IF条件判断

场景描述 在开发的场景中,常常会遇到打折的业务需求,每个用户对应的等级,他们的打折情况也是不一样的。例如普通会员打9折,青铜会员打8.5折,黄金会员打8折等等。在一般开发中最简单的就是...

小码农薛尧
2019/12/01
16
0
面试官:CAP都搞不清楚,别跟我说你懂微服务!

CAP理论指在一个分布式系统中,一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三个要素最多只能同时实现两点,不可能三者兼顾。 让我们想象一个简单的...

lucifer210
07/08
17
0
聊起车联网技术时,我们可能想说什么

1981年世界上第一个车载导航系统被集成在Honda汽车上,30多年来,随着芯片、通信和互联网技术的快速发展,汽车软件发生着巨大的变化。 随着越来越多的传感器,摄像头,自动驾驶等新技术被集成...

曲奇泡芙
2019/03/10
15
0
开篇初衷

本科的时候看过一本书,叫做《读大学,究竟读什么》,里面的开篇是这样说的:“大学的路上有很多陷阱与诱惑,这些坑有人掉进去之后又爬了出来,觉得很不好意思,然后走了,所以不会在这个坑旁...

pcwlkpzc
2019/01/12
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部