【Head First Servlets and JSP】笔记12:URL重写
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、另外一些问题:
- Q:既然url重写只是后备方法,那么容器怎么知道何时启用url重写?A:容器在第一次与客户端通信的时候会同时使用两种方式(cookie和url重写),以此作为一种安全的“试探”,认真观察一下Java Servlet中的会话管理——URL重写中程序的运行情况就很清楚了,第一次切换页面url一定会重写。
- url重写只存在于动态页面。这里需要考虑一个性能问题。
- 特定的Web容器解析特定的“重写的URL”,例如Tomcat解析的重写URL的分隔符是;号。
- URL编码只与响应有关。切不可在request上调用encodeURL!
【Head First Servlets and JSP】笔记12:URL重写的更多相关文章
- 12.URL重写
为什么要URL重写?1.有利于SEO(搜索引擎优化),带参数的RUL权重较低.2.地址看起来更正规,推广uid. 如我们一般在访问网页是会带参数,http://aaa.com/view.htm?id= ...
- 【Head First Servlets and JSP】笔记23:Expression Language(EL) 完全攻略
基本上是<Head First Servlets and JSP>内容的整理.扩充.顺便推荐一个供参考的JSP教程:JSP Tutorial内容很全面,还有一些有趣的实例. 完整代码参考 ...
- 【Head First Servlets and JSP】笔记 25:JSTL 参考
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ t ...
- Spring MVC 学习笔记12 —— SpringMVC+Hibernate开发(1)依赖包搭建
Spring MVC 学习笔记12 -- SpringMVC+Hibernate开发(1)依赖包搭建 用Hibernate帮助建立SpringMVC与数据库之间的联系,通过配置DAO层,Service ...
- Python3+Selenium3+webdriver学习笔记12(js操作应用:滚动条 日历 内嵌div)
#!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记12(js操作应用:滚动条 日历 内嵌div)'''from ...
- 机器学习实战 - 读书笔记(12) - 使用FP-growth算法来高效发现频繁项集
前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第12章 - 使用FP-growth算法来高效发现频繁项集. 基本概念 FP-growt ...
- Ext.Net学习笔记12:Ext.Net GridPanel Filter用法
Ext.Net学习笔记12:Ext.Net GridPanel Filter用法 Ext.Net GridPanel的用法在上一篇中已经介绍过,这篇笔记讲介绍Filter的用法. Filter是用来过 ...
- thinkphp学习笔记6—url模式
原文:thinkphp学习笔记6-url模式 入口文件是应用的唯一入口,因为可以多入口,每个应用可以对应一个入口文件,系统会从rul参数中解析当前请求的模块,控制器,操作.ThinkPHP是区分大小写 ...
- SQL反模式学习笔记12 存储图片或其他多媒体大文件
目标:存储图片或其他多媒体大文件 反模式:图片存储在数据库外的文件系统中,数据库表中存储文件的对应的路径和名称. 缺点: 1.文件不支持Delete操作.使用SQL语句删除一条记录时,对应的文 ...
随机推荐
- Tomcat运行流程
Connector介绍 1.1 Connector的种类 Tomcat源码中与connector相关的类位于org.apache.coyote包中,Connector分为以下几类: Http Conn ...
- Python urllib的urlretrieve()函数解析 (显示下载进度)
#!/usr/bin/python #encoding:utf-8 import urllib import os def Schedule(a,b,c): ''''' a:已经下载的数据块 b:数据 ...
- dm8148 开发之---4路解码器tvp5158
通过采用自动对比度控制与视频噪声过滤技术的全新 TVP515x 器件,采集4通道视频,可带来优异图像质量并实现市场领先的视频解码性能德州仪器 (TI) 宣布推出可实现优异图像质量的新型 TVP5158 ...
- MFC中改变控件的大小和位置(zz)
用CWnd类的函数MoveWindow()或SetWindowPos()能够改变控件的大小和位置. void MoveWindow(int x,int y,int nWidth,int nHeight ...
- linux tableau server 连接 presto
记录一下这个弄个好久的难题 linux tableau server 版本 tableau-server-2018-2-0.x86_64.rpm 安装过程 我参照了这儿仁兄 http://ju. ...
- 单线程爬虫VS多线程爬虫的效率对比
单线程爬虫: import re import requests import time url_EB = 'http://www.amazon.com/gp/search/other/ref=sr_ ...
- keycode 大全,javascript 再也不用操心我不知道的keycode了
keycode 8 = BackSpace BackSpace keycode 9 = Tab Tab keycode 12 = Clear keycode 13 = Enter ...
- Android开发:《Gradle Recipes for Android》阅读笔记1.6——使用android studio添加依赖
有经验的gradle开发者习惯直接编辑build.gradle文件,但是IDE没有提供许多代码提示.IDE提供了一个可视的界面显示配置内容. 点击像文件夹一样的图标可以看到project struct ...
- T-SQL Table-valued Function使用分隔符将字符串转换为表
)=' ') RETURNS @Strings TABLE ( ITEM_VALUE VARCHAR(MAX) ) AS BEGIN DECLARE @index INT ) BEGIN SET @i ...
- 在Visual Studio 2015的Cordova项目中使用Gulp
之前一直是在vs 2013中使用Cordova来开发移动app(目前有iPad版/iPhone版/安卓版),准备到下一个milestone的时候升级到2015,这两天在尝试各种东西. 2015中的co ...