文档章节

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
博文 177
码字总数 285078
作品 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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

流量劫持是如何产生的?

流量劫持,这种古老的攻击沉寂了一段时间后,最近又开始闹的沸沸扬扬。众多知名品牌的路由器相继爆出存在安全漏洞,引来国内媒体纷纷报道。只要用户没改默认密码,打开一个网页甚至帖子,路由...

谢思华
22分钟前
0
0
Hadoop Client无法使用maven下载源码

最近在学习hadoop,使用maven的时候想看一下源码的注释,结果IDEA一直提示无法下载 搞得我一度以为maven坏掉了。 但是通过搜索,发现在maven仓库里确实没有源码.... 而2.8.1以及之前的版本是...

Iceberg_XTY
24分钟前
0
0
为什么程序员千万不要重写代码?

你所做的事情,也许暂时看不到成果,但不要灰心或焦虑,你不是没有成长,而是在扎根。 图片来自网络 0 前言 程序员都有一颗工程师的心,所以当他们到一片新的场地想做的第一件事就是,将旧的...

Java小铺
25分钟前
0
0
VUE集成AdminLte

1. 安装需要到插件 npm i admin-lte -Snpm i jquery -Snpm i axios -Snpm i vue-router -S 2. 配置webpack.config.js 2.1 module.exports.module.rules修改字体loader: {test: /\.(p......

Pasenger
今天
0
0
Spring Aop原理之切点表达式解析

在前面的文章(Spring AOP切点表达式详解)中,我们总结了Spring Aop切点表达式的用法,而在上文(Spring Aop原理之Advisor过滤)中我们讲到,切点表达式的解析主要是在PatternParser.parse...

爱宝贝丶
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部