文档章节

Session会话

放个屁
 放个屁
发布于 2017/06/05 06:59
字数 1133
阅读 47
收藏 0
点赞 0
评论 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失效 */

 

(完)

 

© 著作权归作者所有

共有 人打赏支持
放个屁
粉丝 123
博文 176
码字总数 285078
作品 0
日本
程序员
使用SESSION实现PHP会话的步骤

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

灵犀 ⋅ 2013/07/18 ⋅ 0

(三)Servlets Session会话

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

iborder ⋅ 2016/09/05 ⋅ 0

负载均衡集群中的session解决方案

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

a928154159 ⋅ 2017/09/13 ⋅ 0

会话级序列

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

whshurk ⋅ 01/03 ⋅ 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

Apache Shiro SessionManager配置详解.

SessionManager是在应用程序中为所有Subject提供Session的管理,包括创建,删除,失效及验证等。同其的核心组件一样,SessionManager 也是一个由SecurityManager 维护的顶级组件。 在Shiro中...

东北·赵本山 ⋅ 2015/06/03 ⋅ 0

bboss 会话共享框架 4.0.8 发布

bboss 会话共享4.0.8发布 bboss 会话共享功能特点: 作 用:为应用提供统一会话管理功能,避免集群部署场景下负载切换session丢失问题; 跨域跨应用共享会话并实现SSO功能;解决了会话共享五...

bboss ⋅ 2015/08/02 ⋅ 16

Mina2.0x框架+源码分析

然后来说说IoHandle接口,Mina中的所有I/O事件都是通过这个接口来处理的,这些事件都是上面所说的I/O Processor发出来的,要注意的一点是同一个I/O Processor线程是负责处理多个会话的。包括...

k_k_anna ⋅ 2015/01/26 ⋅ 0

bboss会话共享架构

bboss会话共享架构 bboss session共享特点 作 用:为应用提供统一会话管理功能,避免集群部署场景下负载切换session丢失问题; 跨域跨应用共享会话并实现SSO功能;解决了会话共享五大技术难题...

引鸩怼孑 ⋅ 2015/05/07 ⋅ 0

PHP session使用经验汇总[转载]

什么是session Session 的中文译名叫做“会话”,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个 session。目前社会上...

心语难诉 ⋅ 2014/03/07 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 46分钟前 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 今天 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 今天 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 今天 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

到底会改名吗?微软GVFS 改名之争

微软去年透露了 Git Virtual File System(GVFS)项目,GVFS 是 Git 版本控制系统的一个开源插件,允许 Git 处理 TB 规模的代码库,比如 270 GB 的 Windows 代码库。该项目公布之初就引发了争...

linux-tao ⋅ 今天 ⋅ 0

笔试题之Java基础部分【简】【二】

1.静态变量和实例变量的区别 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变...

anlve ⋅ 今天 ⋅ 0

Lombok简单介绍及使用

官网 通过简单注解来精简代码达到消除冗长代码的目的 优点 提高编程效率 使代码更简洁 消除冗长代码 避免修改字段名字时忘记修改方法名 4.idea中安装lombnok pom.xml引入 <dependency> <grou...

to_ln ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部