1、会话管理的核心在于“交换会话ID”,来回传递cookie是最简单的方法,容器通过客户端发来的JSSESIONID查找匹配的对话。

2、如果浏览器禁用了cookie,那就意味着浏览器将忽略响应首部中的set-cookie,cookie都设置不了,那么浏览器拿什么信息去“匹配会话”呢?

3、解决这个问题的方法就是URL重写,每次切换页面都把“会话ID”添加到URL的后面,容器利用这个“URL后缀信息”去匹配会话。

  • 客户端<——url重写(类似于set-cookie,只不过形式不同)——服务器

  • 客户端——url重写(携带着jsession后缀到服务器认证)——>服务器,提取url后缀信息查找对应回话

4、cookies就是一些字典、键值对,存在于客户端本地、由HTTP请求的首部携带;

session存在于服务端JVM中,是一个存储会话信息的对象,需要对应的JSESSIONID查找、访问。

5、url重写的流程分析。这是进行URL重写的登陆程序,

     if(userID.equals(user) && password.equals(pwd)){
HttpSession session = request.getSession();
// 创建一个session,同时向response添加一个含有JSESSIONID的cookie
// 相当与执行了 request.createSession(); response.addCookie(new Cookie("JSESSIONID", 7DDE0B5AB1BECF68DCDC46F56619F0ED));
session.setAttribute("user", "Pankaj"); session.setMaxInactiveInterval(30*60); //setting session to expiry in 30 mins
Cookie userName = new Cookie("user", user);
response.addCookie(userName); String encodedURL = response.encodeRedirectURL("LoginSuccess.jsp");
// 编码重定向URL

response.sendRedirect(encodedURL);
}

没有进行URL重写的程序,

        if(userID.equals(user) && password.equals(pwd)){
HttpSession session = request.getSession();
session.setAttribute("user", "Pankaj");
//setting session to expiry in 30 mins
session.setMaxInactiveInterval(30*60);
Cookie userName = new Cookie("user", user);
userName.setMaxAge(30*60);
response.addCookie(userName);
response.sendRedirect("LoginSuccess.jsp");
我们发现,除了String encodedURL = response.encodeRedirectURL("LoginSuccess.jsp");这一句外两者没有任何差别,但是,对于程序2而言,一旦浏览器禁用cookie将完全无法使用,
而对于程序1,不论是否禁用cookie都一样能用,url重写的好处就很明显了。
观察一下程序1的运行状况,当我们成功登陆的时候,可以看到url栏的变化:

——————登陆后,将变化为——————>
 

6、在我们一般使用电脑的使用,cookie都是未禁用的,url重写只是作为一个“后备方法”!只有在cookie禁用的时候才生效,就实现URL重写的代码而言,并不需要加很多的代码,简单的encodeURL就好了。

7、另外一些问题:

  1. Q:既然url重写只是后备方法,那么容器怎么知道何时启用url重写?A:容器在第一次与客户端通信的时候会同时使用两种方式(cookie和url重写),以此作为一种安全的“试探”,认真观察一下Java Servlet中的会话管理——URL重写中程序的运行情况就很清楚了,第一次切换页面url一定会重写
  2. url重写只存在于动态页面。这里需要考虑一个性能问题。
  3. 特定的Web容器解析特定的“重写的URL”,例如Tomcat解析的重写URL的分隔符是;号。
  4. URL编码只与响应有关。切不可在request上调用encodeURL!


【Head First Servlets and JSP】笔记12:URL重写的更多相关文章

  1. 12.URL重写

    为什么要URL重写?1.有利于SEO(搜索引擎优化),带参数的RUL权重较低.2.地址看起来更正规,推广uid. 如我们一般在访问网页是会带参数,http://aaa.com/view.htm?id= ...

  2. 【Head First Servlets and JSP】笔记23:Expression Language(EL) 完全攻略

    基本上是<Head First Servlets and JSP>内容的整理.扩充.顺便推荐一个供参考的JSP教程:JSP Tutorial内容很全面,还有一些有趣的实例. 完整代码参考 ...

  3. 【Head First Servlets and JSP】笔记 25:JSTL 参考

    <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ t ...

  4. Spring MVC 学习笔记12 —— SpringMVC+Hibernate开发(1)依赖包搭建

    Spring MVC 学习笔记12 -- SpringMVC+Hibernate开发(1)依赖包搭建 用Hibernate帮助建立SpringMVC与数据库之间的联系,通过配置DAO层,Service ...

  5. Python3+Selenium3+webdriver学习笔记12(js操作应用:滚动条 日历 内嵌div)

    #!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记12(js操作应用:滚动条 日历 内嵌div)'''from ...

  6. 机器学习实战 - 读书笔记(12) - 使用FP-growth算法来高效发现频繁项集

    前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第12章 - 使用FP-growth算法来高效发现频繁项集. 基本概念 FP-growt ...

  7. Ext.Net学习笔记12:Ext.Net GridPanel Filter用法

    Ext.Net学习笔记12:Ext.Net GridPanel Filter用法 Ext.Net GridPanel的用法在上一篇中已经介绍过,这篇笔记讲介绍Filter的用法. Filter是用来过 ...

  8. thinkphp学习笔记6—url模式

    原文:thinkphp学习笔记6-url模式 入口文件是应用的唯一入口,因为可以多入口,每个应用可以对应一个入口文件,系统会从rul参数中解析当前请求的模块,控制器,操作.ThinkPHP是区分大小写 ...

  9. SQL反模式学习笔记12 存储图片或其他多媒体大文件

    目标:存储图片或其他多媒体大文件 反模式:图片存储在数据库外的文件系统中,数据库表中存储文件的对应的路径和名称. 缺点:     1.文件不支持Delete操作.使用SQL语句删除一条记录时,对应的文 ...

随机推荐

  1. 整理mp4协议重点,将协议读薄

    MP4 实际代表的含义是 MPEG-4 Part 14.它只是 MPEG 标准中的 14 部分.它主要参考 ISO/IEC 标准来制定的.MP4 主要作用是可以实现快进快放,边下载边播放的效果.他是基 ...

  2. 第一百八十节,jQuery-UI,知问前端--消息提示 UI

    jQuery-UI,知问前端--消息提示 UI 学习要点: 1.HTML 部分 2.CSS 部分 3.jQuery 部分 通过前面已学的 jQuery UI 部件,我们来创建一个注册表单. html ...

  3. 什么是 AJAX?

    AJAX = 异步 JavaScript 和 XML(Asynchronous JavaScript and XML). 简短地说,在不重载整个网页的情况下,AJAX 通过后台加载数据,并在网页上进行 ...

  4. HttpURLConnectionClient

    package com.utils; import com.pay.util.AES; import org.apache.log4j.Logger; import javax.net.ssl.Htt ...

  5. 1249 Problem Q

    问题 Q: 比大小 时间限制: 1 Sec  内存限制: 128 MB 提交: 159  解决: 66 [提交][状态][讨论版] 题目描述 给你两个很大的数,你能不能判断出他们两个数的大小呢? 比如 ...

  6. react import改为绝对路径

    最近在使用react时发现路径用../../很不方便,特别是修改项目结构时,加减../都能改到吐血, 所有在网上找了半天webpack的配置,特此记录下 module.exports = (webpa ...

  7. Convert.ToInt32(string '000000003') 变成了 3

    Convert.ToInt32(string '000000003') 变成了 3 但是在查询的时候需要用的是string 这里的convert.toint32 反而起了坏作用,不是所有的时候都要用c ...

  8. C# Static修饰符的作用

    MSDN上的定义 Use the static modifier to declare a static member, which belongs to the type itself rather ...

  9. getFullYear 方法

    返回 Date 对象中用本地时间表示的年份值. dateObj.getFullYear() 必选项 dateObj 参数为 Date 对象. 说明要获取用全球标准时间 (UTC)表示的年份值,请使用 ...

  10. 面向对象、接口编程的重要性 python 为什么引入接口interface

    面向对象编程的实践 有个产品,其有10个子产品,现在要统计每日消费数据其中8个子产品的消费入账金额算法相同,2个不同; 拓展性差的糟糕的代码 def ConsumptionSum(product): ...