会话:
是指一个客户端/浏览器与web服务器之间连续发生的一系列请求和响应的过程,会话技术也可以说成服务器跟踪用户信息的技术
客户端/浏览器会话技术:Cookie
服务器端会话技术:Session
Cookie是一种会话技术,用于将会话过程中的数据保存在用户的浏览器中,方便浏览器和服务器更好的进行数据交互
当你(客户端)去理发店(服务器端)理发时,理发店让你办一张会员卡,这个会员卡(Cookie)会记录的你的一些数据比如姓名手机号,存入卡片金额等,你接收了这张卡片,以后再来理发直接使用这张会员卡。这样就直接简化了你的操作
会员卡由理发店产生,经理发店发送到用户手里,以后用户访问理发店带着会员卡
同样,客户端/浏览器发送请求到服务器,与服务器建立会话,服务器会生成Cookie返回给客户端,当用户第二次访问服务器时,浏览器会携带Cookie(存在于请求头中)发送到服务器,方便服务器做出正确响应。
Cookie类的构造方法
/*
name用于指定Cookie的名称,value用于指定Cookie的值
Cookie一但创建name不可更改,value可以更改
*/
public Cookie(String name, String value){
validation.validate(name);
this.name = name;
this.value = value;
}
Cookie的常用方法
方法声明 | 功能描述 |
---|---|
String getName() | 返回Cookie的名称 |
void setValue(String newValue) | 用于为Cookie设置新的值 |
String getValue() | 返回Cookie的值 |
void setMaxAge(int expiry) | 设置Cookie在浏览器的存活秒数 |
int getMaxAge() | 返回Cookie在浏览器的存活秒数 |
void setPath(String uri) | 设置该Cookie项的有效目录路径 |
String getPath() | 返回该Cookie项的有效目录路径 |
void setDomain(String pattern) | 设置Cookie项的有效域 |
String getDomain() | 返回Cookie项的有效域 |
void setMaxAge(int expiry) 注意:
当设置的值为正数时代表Cookie会被持久化到本地的硬盘上,
在设置的时间内,重启浏览器依然保持有效,超过这个秒数,cookie会自动删除;
当设置的值为负数时代表关闭浏览器Cookie会被自动删除,默认的也是这个;
当设置的值为0时,表示通知浏览器立即删除这个Cookie
void setPath(String uri):设置cookie的有效目录路径
一个服务器中部署了多个web项目,那么在这些web项目中cookie能不能共享?
默认情况下cookie不能共享,仅对当前虚拟路径及其子目录子目录有效
如果需要共享,将uri设置为"/"
void setDomain(String pattern):设置Cookie项的有效域
不同的tomcat服务器间cookie共享问题?
如果设置一级域名相同,那么多个服务器之间cookie可以共享
默认情况下,domain的属性值为当前主机名,domain的属性值不区分大小写;
设置domain的属性值必须以"."开头
setDomain(".baidu.com"),那么在tupian.baidu.com和zhidao.baidu.com中cookie可以共享
使用Cookie的步骤
1. 创建Cookie对象,绑定数据
new Cookie(String name, String value)
2. 发送Cookie对象
response.addCookie(Cookie cookie)
3. 获取Cookie,拿到数据
Cookie[] request.getCookies()
案例:显示用户上次的访问时间
注意: 在tomcat8之后,Cookie可以设置中文数据,但是不支持特殊字符, yyyy年MM月dd日 HH:mm:ss
中有一个空格,需要进行URL编码, 否则会报异常或者500的状态码, 取出value(时间)后, 再进行URL解码即可
package com.ligong.cookie;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
@WebServlet("/cookieTest")
public class CookieTest3 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置服务器输出内容的编码方式为UTF-8,防止乱码
response.setContentType("text/html;charset=utf-8");
String value = null;
//获取所有Cookie
Cookie[] cookies = request.getCookies();
if (cookies!=null && cookies.length>0) {
for (Cookie cookie : cookies) {
//如果找到lastTime就把他取出来进行URL解码
if ("lastTime".equals(cookie.getName())){
value = cookie.getValue();
value = URLDecoder.decode(value,"utf-8");
break;
}
}
}
//有没有值,有值说明取出来了,没值就第一次
if (value==null) {
response.getWriter().print("欢迎您首次访问本站"
);
} else {
response.getWriter().print("您上次访问本站的时间是:"
+ value + ""
);
}
//创建cookie,将当前时间作为cookie的值发送给客户端
String newTime = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss").format(new Date());
newTime = URLEncoder.encode(newTime, "utf-8");//进行URL编码,否则日期和时间有个空格,Cookie无法存储特殊字符
Cookie cookie = new Cookie("lastTime", newTime);//设置Cookie的名字为lastTime,值为编码后的时间
cookie.setMaxAge(60 * 60);//设置存活时间为1个小时,超过这个时间Cookie就凉了
response.addCookie(cookie);//将Cookie放在响应头里
}
}
概念:一种服务器端会话技术,将数据保存在服务器端的对象中(HttpSession),用于一次会话的多次请求间共享数据.
Session就好像人们(浏览器)访问医院时,医院(服务器端)生成一张排队票,票上有唯一的卡号(id),医院根据这个id便可以查询到该病人的病例当浏览器访问服务器时,Servlet容器会创建一个Session对象和ID属性,Session对象相当于病例信息,ID相当于卡号,客户从浏览器访问服务器时,将SessionID传递给服务器,服务器就能判断是那个客户端发出的,从而选择对应的Session对象为其服务
Session借助Cookie技术来传送ID属性,就是SessionID被储存在Cookie中响应给浏览器,在响应头可以看到Set-Cookie:JSESSION=11111;当浏览器访问服务器时,会在请求头中将Cookie(Cookie:JSESSION=11111)发送给服务器,服务器根据ID找到对象的Session对象
HttpServletRequest
定义了获取Session对象的getSession方法
//带参构造方法中如果传递的参数为true,则在相关的HttpSession对象不存在时创建新的HttpSession对象,为false,就不创建新的Session对象,返回null值
public HttpSession getSession(booblean create)
//空参构造方法通带参的true,没有相关的HttpSession对象时就创建新的对象
public HttpSession getSession()
仅介绍HttpSession
的几个常用方法
方法声明 | 方法描述 |
---|---|
Object getAttribute(String name) | 通过name获取指定的属性对象 |
void setAttribute(String name, Object value) | 设置指定name的属性对象 |
void removeAttribute(String name) | 删除指定名称的属性 |
String getId() | 返回HttpSession对象相关联的SessionID值 |
long getCreationTime() | 返回Session创建的时间距1970年1月1日00:00:00相差的毫秒值 |
void invalidate() | 用于强制使Session对象无效 |
boolean isNew() | 判断当前HttpSession对象是否是新创建的 |
ServletContext getServletContext | 返回所属的ServletContext对象 |
Session超时管理
在http协议中无法判断客户端与服务器什么时候断开连接,无法检测浏览器是否关闭,为了防止服务器保留的HttpSession对象积累的过多导致内存耗尽,web服务器采用超时限制,当客户端在指定的时间内没有访问服务器,服务器就会认为客户端已经结束请求,与该客户端的会话对应的HttpSession对象就会变成垃圾对象,从内存中被清除掉,超时后再次请求,就会创建新的Session对象,并分配新的SessionID
在tomcat安装目录\conf\web.xml文件中可修改超时管理时间,默认时间为30分钟,如果设置成负数或0表示会话永不超时
<session-congig>
<session-timeout>30session-timeout>
session-congig>
服务器关闭时会自动调用invalidate()方法,HttpSession
对象会被销毁
超过超时管理时间,HttpSession
对象会被销毁
手动调用invalidate
()方法,HttpSession
对象会被销毁
注意:如果没有指定Cookie的存活时间,当重启浏览器时原来的Cookie就会被销毁,其存储的SessionID
也会消失,这时再次访问服务器会产生新的会话,以及新的HttpSession
对象,无法再使用以前对象所拥有的属性