本帖最后由 麻绛 于 2018-9-12 15:52 编辑
Day18
会话
一次会话包含客户端和服务器建立连接后到断开连接的多次请求和响应.
会话技术
用来解决用户数据私有化的问题,在一次会话的范围的多次请求间内共享数据
会话技术分为
Cookie,客户端会话技术
Session,服务端会话技术
一.Cookie
[size=18.6667px]概念
客户端会话技术,将数据保存到客户端
快速入门
1.创建Cookie对象,绑定数据
2.发送Cookie对象
3.获取Cookie,拿到数据
存入数据进Cookie对象后,服务器向客户端发送响应时,其中Cookie对象里的数据,会存在set-Cookie响应头中.浏览器发送除第一次请求外的请求时,Cookie的数据会存在Cookie请求头中
注意事项
一次会话中,创建一个新的Cookie对象时如果向已有的key存值,会将该键原有的值覆盖.如果不将该Cookie对象重新赋值,浏览器每次请求该项目的请求头都会带有该Cookie
Cookie注意事项
1. 可以创建多个Cookie对象,使用Response对象调用多次addCookie方法即可,发送多个Cookie对象,会在响应体内创建多个set-Cookie响应头.
2. 默认情况下,Cookie的数据会存在浏览器内存中,浏览器关闭后Cookie对象会被销毁,
如需持久化保存,需要调用setMaxAge(int seconds)方法
1) setMaxAge(int seconds),参数为秒,非毫秒
参数为正整数表示Cookie数据会保存在文件中,文件会在超过参数时间后自动删除.
参数为负整数表示Cookie数据会保存在浏览器内存中,数据会在浏览器当前窗口关闭后被清楚.
参数为零表示立即删除Cookie数据的物理文件.
3.在Tomcat 8之前,Cookie不能储存中文数据,需要将中文数据转码,也不支持特殊字符,Tmocat8之后支持中文,特殊字符还是不支持,比如空格.
4.Cookie获取范围,默认Cookie数据在多个项目之间不能共享
调用setPath(String path)参数为Cookie生效的范围的项目的虚拟路径,表示当访问参数虚拟目录项目的资源时发送的请求才会有包含该数据的Cookie请求头
如只写一个"/"表示服务器下所有项目都能获取该Cookie
5.不同的Tomcat服务器之间Cookie共享
调用setDomain(String path)设置一级域名相同,name多个服务器之间Cookie可以共享,暂时用不上
Cookie特点和作用
特点
1. Cookie将共享的数据存储在客户端.
2. 浏览器对单个Cookie的大小有限制(最大4kb),对同一域名下的持久化储存的总Cookie数量有限制(最多20个)左右.
作用
1.Cookie一般用于存储少量的不太敏感的数据
2.在不登录的情况下,完成对客户端身份的识别
API汇总
// javax.servlet.http.HttpServletRequest 请求对象
Cookie[] getCookies() | 获取该次请求中的Cookies请求头,将多个Cookie对象封装为数组返回 | // javax.servlet.http.HttpServletResponse 响应对象
void addCookie(Cookie var1) | 将Cookie对象以set-Cookie响应头的形式添加进响应 |
// javax.servlet.http.Cookie Cookie对象用来在多次请求和响应中共享一些不太敏感的数据.
newCookie(String name, String value) | 通过构造方法获取Cookie对象,参数传入Cookie的键和值,只能是字符串格式,且有大小限制 | void setMaxAge(int expiry) | 设置Cookie以文件形式保存在客户端浏览器的时间,时间到后会自动删除,传0会立刻删除 | void setPath(String uri) | 参数为Cookie生效的范围的项目的虚拟路径,只写一个"/"表示整个服务器项目生效,
具体执行原理为,客户端请求参数项目时,
| String getName() | 获取该Cookie对象的键 | String getValue() | 获取该Cookie对象的值 | void setValue(String newValue) | 修改value的值,传入新的值 | // java.net.URLEncoder 可将字符串进行URL格式的编码
因为Tomcat8之前Cookie中不能存储中文数据(存了直接报错),所以需要用到以下两种方法进行编码,但是特殊字符还是不支持
static String encode(String s, String enc) | 参数1传入想要进行编码的字符串,参数2传入编码依照的字符集 | // java.net.URLDecoder 可将字符串依照URL格式进行解码
static String decode(String s, String enc) | 参数1传入编码后的字符集进行解码,参数2传入编码时使用的字符集 |
二.JSP
Java Servlet Pages
Java服务器端页面,可以理解为一个特殊的页面,即可以定义Html标签,又可以定义Java代码. 用于简化书写!
JSP = Html + Java +Jsp内置的东西
JSP运行流程
1.服务器解析请求消息,找到是否有index.jsp资源
2.如果找到了,会将index.jsp转换为继承了HttpJspBase类(该类继承了HttpServlet)的.java文件
3.编译.java文件,生成.class文件
4.最终得到Jvm执行
得出jsp本质上就是一个Servlet
JSP脚本格式
JSP来定义Java代码的书写格式
1.<% Java代码 %>
定义的Java代码转换后会在Service方法中,Service方法中可以定义什么,该脚本就可以定义什么.
2.<%! Java代码 %>
定义的Java代码转换后会在类的成员位置,可以定义成员变量和成员方法.用的较少,因为Servlet里尽量不要定义成员变量,会引发线程安全问题
3.<%= Java代码 %>
定义的Java代码,会输出在页面上.输出语句中可以定义什么,该脚本就可以定义什么,定义的Java代码转换后也会在Service方法中.
JSP的内置对象
JSP页面中不需要获取和创建,可以直接使用的对象
JSP一共有9个内置对象。
今天学习3个
request | 请求对象 | response | 响应对象 | out | 字符输出流对象。可以将数据输出到页面上。和response.getWriter()类似 |
1) response.getWriter()和out.write()的区别
在tomcat服务器真正给客户端做出响应之前,会先找response缓冲区数据,再找out缓冲区数据。
response.getWriter()数据输出永远在out.write()之前,JSP里输出用out输出,不要用request.getWriter
三.Session
概念
服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession
快速入门
// javax.servlet.http.HttpServletRequest
HttpSession getSession() | 获取HttpSession对象 | // javax.servlet.http.HttpSession
使用HttpSession对象
void setAttribute(String name, Object value) | 向HttpSession对象添加键值对格式的数据,值的类型可以是任意类型,且大小没有限制 | Object getAttribute(String name) | 通过键获取值,值为Object类型 | void removeAttribute(String name) | 通过键删除值 |
原理
当客户端的发出的一次请求,服务端通过request调用getSession方法开辟一个Session空间,然后生成一个HttpSessionID以set-Cookie响应头的形式响应回客户端.客户端如再发送请求会在Cookie请求头中发送对应的HttpSessionID到服务端再次通过request调用getSession方法找到对应的Session空间,从而实现一次会话的数据共享和数据私有化.
所以,Session的实现是依赖于Cookie的。
响应头和请求头的格式
set-Cookie: JSESSIONID = 随机HttpSessionID
Cookie: JSESSIONID = 随机HttpSessionID
Session注意事项
1. 当客户端关闭后,服务器不关闭,两次获取session默认情况下不是一个对象
如果多次会话需求相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让HttpSessionID持久化保存。
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);
2. 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作
session的钝化
在服务器正常关闭之前,将session对象系列化到硬盘上
session的活化
在服务器启动后,将session文件转化为内存中的session对象即可。IDEA无法实现活化,因为每次IDEA运行服务器时会把work目录删除,然后创建新的work目录
3. session什么时候被销毁?
1) 服务器非正常关闭
2) session对象调用invalidate()方法,自动销毁该对象
3) session默认失效时间30分钟,自最后一次调用getSession方法后开始计时
选择性配置修改,单位分钟
在web.xml设置所有的Session对象的失效时间
<session-config>
<session-timeout>30</session-timeout>
</session-config>
5.session的特点
1) session用于存储一次会话的多次共享的数据,存在服务器端
2) session可以存储任意类型,任意大小的数据
6.session与Cookie的区别
1) session存储数据在服务器端,Cookie在客户端
2) session没有数据大小限制,Cookie有
3) session数据安全,Cookie相对于不安全
|
|