Http是一个无状态的协议,每一次的请求都是独立的,请求之间无法实现数据共享
一次会话:浏览器第一次给服务器资源发送请求 会话建立 直到有一方断开为止
会话:一次会话中包含多次请求和响应(浏览器给服务器发送数据:一次请求,服务器给浏览器反馈数据:一次响应)
功能:在一次会话的范围内的多次请求间 共享数据
方式:客户端会话技术 Cookie 服务器端会话技术 Session
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
Cookie操作
//1. Cookie(String name, String value) 实例化Cookie对象,传入cooke名称和cookie的值
Cookie cookie = new Cookie("hello","hello");
//2. public String getName() 取得Cookie的名字
String name = cookie.getName();
//3. public String getValue() 取得Cookie的值
String value = cookie.getValue();
//4. public void setValue(String newValue) 设置Cookie的值 设置Cookie的值
cookie.setValue("你好");
//5. public void setMaxAge(int expiry) 设置Cookie的最大保存时间
//设置Cookie的最大保存时间,即cookie的有效期,当服务器给浏览器回送一个cookie时,
// 如果在服务器端没有调用setMaxAge方法设置cookie的有效期,那么cookie的有效期只在一次会话过程中有效,
// 用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一次会话,
// 当用户关闭浏览器,会话就结束了,此时cookie就会失效,
// 1.默认情况下 当浏览器关闭后 Cookie数据被销毁
// 2.设置Cookie的生命周期 持久化存储:
// setMaxAge(int second);
// 1.正数:将Cookie数据写到硬盘的文件中 持久化存储 cookie的存活时间
// 2.负数:默认值 浏览器一关 cookie数据销毁
// 3.零:删除cookie信息
cookie.setMaxAge(60*60);
//6. public int getMaxAge() 获取Cookies的有效期
int maxAge = cookie.getMaxAge();
//7.public void setPath(String uri)
//设置cookie的有效路径,比如把cookie的有效路径设置为"/xdp",那么浏览器访问"xdp"目录下的web资源时,
// 都会带上cookie,再比如把cookie的有效路径设置为"/xdp/gacl",那么浏览器只有在访问"xdp"目录下的"gacl"
// 这个目录里面的web资源时才会带上cookie一起访问,
// 而当访问"xdp"目录下的web资源时,浏览器是不带cookie的
cookie.setPath("/"); //表示当前所有的资源都能够共享该Cookie信息
Cookie应用实例
ackage com.cookie.servlet;
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.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 示例:使用cookie记录用户上一次访问的时间
*/
@WebServlet("/hello")
public class Servlet01 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
boolean flag = false;
//设置服务器端以UTF-8编码进行输出
response.setCharacterEncoding("utf-8");
//设置浏览器以UTF-8编码进行接收,解决中文乱码问题
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
//获取客户传来的cookie数组
Cookie[] cookies = request.getCookies();
if(cookies!=null && cookies.length>0){
//遍历cookies
for(Cookie cookie : cookies){
//如果有名字为lastTime的cookie
if("lastTime".equals(cookie.getName())){
flag = true;
//获取cookie的值
String value = cookie.getValue();
out.write("您上次的登录时间是:"+value);
//把当前时间保存到cookie中
Date date = new Date();
SimpleDateFormat sf = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
String now = sf.format(date);
cookie.setValue(now);
//更新cookie
response.addCookie(cookie);
break;
}
}
}
if ( cookies==null ||cookies.length==0 || flag==false){
//第一次访问
Date date = new Date();
SimpleDateFormat sf = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
String now = sf.format(date);
Cookie cookie = new Cookie("lastTime",now);
cookie.setMaxAge(24*60*60);
response.addCookie(cookie);
out.write("这是您第一次访问本站");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
********************************************************************
Session
是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
Session 服务器端会话技术
1.在一次会话的多次请求间共享数据 将数据保存在服务器端的对象中 httpSession
2.快速入门
1.获取HttpSession对象
HttpSession session = request.getSession();
2. 使用HttpSession对象
session.setAttribute("msg","hello session");
session.getAttribute("msg");
3.原理
Session的实现时依赖于Cookie
服务器如何确保在一次会话范围内 多次获取的Session对象是同一个?
第一次获取Session 没有Cookie 会在内存中创建一个新的Session对象
4.细节:
1.当客户端关闭后,服务器不关闭,两次获取的session是否为同一个?
默认情况下不是
如果需要相同 则可以创建cookie 键为JSESSIONID 设置最大存活时间 让cookie持久化
Cookie c = new Cookie("JSESSIONID" , session.getId());
c.setMaxAge(60*60);
response.addCookie(c);
2.客户端不关闭 服务器关闭后 两次获取的session是同一个?
服务器关闭 session就被销毁了 不是同一个 但是要确保数据不丢失
session的钝化:序列化 将对象转成二进制数据
在服务器正常关闭之前 将session对象序列化到硬盘上
session的活化:反序列化
在服务器启动后,将session文件转化为内存中的session对象即可
3.session的失效时间问题
1.服务器关闭
2.session调用方法 invalidate()
3.session默认失效时间 30分钟
Session的特点
session用于存储一次会话的多次请求的数据 存在服务器端
session可以存储任意类型 任意大小的数据
session与cookie的区别
session存储数据在服务器端 cookie在客户端
session没有数据大小限制 cookie有
session数据安全 cookie相对于不安全