现在我们希望能够跨多个请求保留客户特定的状态. 现在, 模型中的业务只是检查请求中的参数, 并返回一个响应(建议), 应用中没有谁记得在当前请求之前与这个客户之间发生过什么.

与一个客户的整个会话期间, HttpSession对象会持久存储, 对于会话期间客户做的所有请求, 从中得到的所有信息都可以用HttpSession对象保存.

这里有个问题, 容器怎么知道客户是谁 ?

不能通过ip地址作为客户的唯一标识, 因为在外界看来, 如果局域网里的客户通过一个路由器连接到Internet, 那么所有客户都显示为路由器的ip地址, 但是他们是不同的客户, 如果这时候是网上购物, 那么大家就都放在同一个购物车里了.

所以, 客户需要一个唯一的会话ID, 道理很简单, 对客户的第一个请求, 容器会生成一个唯一的会话ID, 并通过响应把它返回给客户, 客户再以后的每一个请求中发回这个会话ID, 容器看到ID后, 会找到匹配的会话, 并把这个会话与请求关联. 看来这个ID就代表了一个session, 这个ID 就叫做 session ID, 会话ID.

客户和容器如何交换会话ID信息 ?

客户和容器之间通过 cookie 交换会话ID

容器几乎会做所有COOKIE工作

你确实必须告诉容器你想创建或使用一个会话, 但是除此之外, 生成会话ID, 创建新的cookie对象, 把会话ID放到cookie中, 把cookie设置为响应的一部分等等工作都是由容器负责, 对于后续的请求, 容器会从请求中的cookie得到会话ID, 这个会话ID与一个现有的会话匹配, 并把会话与当前请求关联.

在响应中发送一个会话cookie, HttpSession session = request.getSession();

判断是否为新会话, 还是之前的会话

HttpSession session = request.getSession();

if (session.isNew()) {

out.println(“This is a new session.”);

} else {

out.println(“Welcome back!”);

}

就算是客户不接受cookie, 你也能完成会话, 但是必须稍微多做点工作...

当用户禁用cookie时, 即cookie 不能工作时,在请求调用getSession(), 容器就会尝试使用cookie, 如果没有启动cookie, 这说明客户部不会加入会话, 换句话说, 会话的isNew()方法总会返回true, 也就是说, 每次都是一个新会话.

URL重写: 一条后路

容器就会求助于url重写, 但是只有当你额外做了一些工作, 对响应中发送的所有URL完成了编码, 此时URL重写才奏效,  response.encodeURL(“/BeerTest.do”) 想这个URL增加额外的会话ID信息.

所谓的 URL重写, 只是在url 后边加上 session_id 的信息. URL + ; jsessionid=1234567

容器没有办法判断是COOKIE失效还是第一次新的会话没有从客户那得到会话ID的信息, 所以它会采取双保险, 不仅针对会话ID有一个”set-cookie”首部, 而且会向URL追加会话ID(假设使用了response.encodeURL())。

把请求重定向到另外一个URL, 但是还是想使用一个会话, response.encodeRedirectURL(“/BeerTest.do”)

容器怎么知道cookie不能正常工作呢? 容器什么时候决定使用 URL重写 ?

当容器看到一个对 getSession()的调用, 而且容器从客户的请求没有得到会话ID, 它就知道必须尝试与客户建立一个新的会话. 此时, 容器并不知道cookie是否工作, 所以向客户返回第一个响应时, 它会同事尝试cookie和URL重写这两种做法.

为什么不先试试cookie, 得不到返回时再下一个响应中完成 URL重写 ?

容器没有从客户得到会话ID, 容器并不能判断这是一个新的会话还是cookie不能使用. 所以会采用双保险.

URL重写是自动的, 但是只有当你对URL完成了编码时它才奏效, 必须通过响应对象的一个方法(可以是 encodeURL()或encodeRedirectURL())来运行所有URL, 其他的所有事情都是由容器来做.

会话内容会保存在服务器中, 占用服务器内存空间, 那么如何删除会话呢?

这个删除时有讲究的, 不能session断开连接了就删除了, 因为有可能客户等一下来请求了, 所以, 我们的目的是, 如果客户在"太长"时间内还没有来请求, 那我们就删除 session对象. 那么这个时间多久算"太长"呢?

HttpSession 有哪些方法

cookie 还有其他作用么 ?

cookie 实际上就是客户和服务器之间交换的一小段数据(一个名/值 String对)

cookie 的一大妙处是, 用户不必介入, cookie 交换式自动的. 默认的, cookie与会话的寿命一样长, 但是你也可以让cookie活的更长一些.

-- 发送 cookie

Cookie cookie = new Cookie(“username”, name);

cookie.setMaxAge(30*60); // 设置cookie在客户端存活多久, 30*60秒=30分

response.addCookie(cookie);

-- 从客户端 得到cookie

Cookie[] cookies = request.getCookies();

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

Cookie cookie = cookies[i];

if (cookie.getName().equals(“username”)) {

String userName = cookie.getValue();

out.println(“Hello ” + userName);

break;

}

}

HeadFirst Jsp 06 (会话管理)的更多相关文章

  1. [Servlet&amp;JSP] HttpSession会话管理

    我们能够将会话期间必须共享的资料保存在HttpSession中,使之成为属性.假设用户关掉浏览器接受Cookie的功能.HttpSession也能够改用URL重写的方式继续其会话管理功能. HttpS ...

  2. SAP接口编程 之 JCo3.0系列(04) : 会话管理

    在SAP接口编程之 NCo3.0系列(06) : 会话管理 这篇文章中,对会话管理的相关知识点已经说得很详细了,请参考.现在用JCo3.0来实现. 1. JCoContext 如果SAP中多个函数需要 ...

  3. 我的Java之旅 第七课 JAVA WEB 会话管理

    1.隐藏域       隐藏域其实不是Servlet/JSP的会话管理机制的内容,但它能实现简单的页面状态记录的效果. 2.Cookie    Cookie类    setMaxAge() 设置有效期 ...

  4. 10、会话管理/编程实战分析/Jsp

    1 会话管理回顾 会话管理 1)会话管理: 管理浏览器和服务器之间的会话过程中产生的会话数据 2)Cookie技术: 会话数据保存在浏览器客户端. Cookie核心的API: 2.1 在服务器端创建C ...

  5. 【JSP&Servlet学习笔记】4.会话管理

    Http本身是无状态通信协议,要进行会话管理的基本原理,就是将需要维护的状态回应给浏览器,由浏览器在下次请求时主动发送状态信息,让Web应用程序“得知”请求之间的关联. 隐藏字段是将状态信息以窗体中看 ...

  6. jsp/servlet学习三之会话管理初解

    由于http的无状态性,使得会话管理或会话跟踪成为web应用开发一个无可避免的主题.默认下,一个web服务器无法区分一个http请求是否为第一次访问.例如,一个web邮件应用要求用户登陆后才能查看邮件 ...

  7. Java中的会话管理——HttpServlet,Cookies,URL Rewriting(译)

    参考谷歌翻译,关键字直接使用英文,原文地址:http://www.journaldev.com/1907/java-session-management-servlet-httpsession-url ...

  8. shiro会话管理

    Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如web容器tomcat),不管JavaSE还是JavaEE环境都可以使用,提供了会话管理.会话事件监听.会话存储/持久化.容器无关的集群. ...

  9. 【技巧总结】Penetration Test Engineer[4]-Web-Security(文件处理、会话管理、访问控制、SSRF、反序列化漏洞)

    Web安全基础2 3.8.文件处理 1)文件上传 一个正常的业务需求,问题在于控制上传合法文件. 防御文件上传 客户端javascript校验(通常校验扩展名) 检查MIME类型 检查内容是否合法 随 ...

随机推荐

  1. 讨论下IDS的绕过

    自从知道dedecms自带了80sec的内置Mysqlids后,一直以来也没有想到绕过的办法.或者是自己mysql的根底太差了吧.于是分析dedecms源码时,只找模板执行,本地包含,上传等,完全没有 ...

  2. 关于JS APP

    多屏screen, JS如何路由,如何换页,导航.通过JS来实现. 当前页面的逻辑通过JS来实现.HTML DOM, Event, Widget. 核心在于function. JS 不仅仅是DOM, ...

  3. Sqli-labs less 63

    Less-63 和less62一致,我们只需要看到sql语句上 $sql="SELECT * FROM security.users WHERE id='$id' LIMIT 0,1&quo ...

  4. B股

    B股的正式名称是人民币特种股票.它是以人民币标明面值,以外币认购和买卖,在中国境内(上海.深圳)证券交易所上市交易的外资股.B股公司的注册地和上市地都在境内.

  5. 【动态规划】 之最长公共子序列LCS

    int lcs_len(char *a, char *b, int c[][N]){ int aLen=strlen(a), bLen=strlen(b), i,j; ; i<=aLen; i+ ...

  6. ZJU 1180 Self Numbers(暴力模拟判断,水题)

    题目链接 同HDU 1128 , POJ 1316(这个范围小一点). 原本怕超时,以为有技巧或者规律,死命的想,后来发现这就是一道水体,模拟着全部判断一下就好了,10秒呢,完全不怕超时...唔,废话 ...

  7. Activity学习(四)——简单切换

    理论学习Activity之后,我们就来具体的实战,Activity之间相互切换依靠的是“ 意图 ”(Intent),这个 Intent 包含了要跳转到的Activity的一些信息,因为Activity ...

  8. HDU 1789 Doing Homework again (贪心)

    Doing Homework again http://acm.hdu.edu.cn/showproblem.php?pid=1789 Problem Description Ignatius has ...

  9. 01 - 开发成功的Oracle应用

    笔记 1. 开发数据库应用,不能把数据库当黑盒.需要了解数据库的一下内容 数据库的体系结构 并发控制 开发的时候就要调优你的代码 数据库有哪些特性,不要在你的代码里重复实现 深入的学习SQL 2. 我 ...

  10. 李洪强iOS开发之OC[010] - 有参方法的声明实现和调用

    // //  main.m //  09 - 有参方法的声明实现和调用 // //  Created by vic fan on 16/7/5. //  Copyright © 2016年 李洪强. ...