一、会话技术的概述
会话技术可以简单理解为,一个用户打开一个浏览器,在同一个WEB应用上,点击多个超链接,访问多个WEB资源,然后关闭浏览器,这样的整个过程我们称为一个会话。
1、会话的作用
- 会话技术可以保存用户在会话过程中所产生的数据
- 会话技术也可以让用户在同一个会话中实现数据的共享
我们平常在浏览网页的时候一些不太重要信息,例如:上次访问的时间、记住用户名等,都可以使用会话技术存储,简单来讲会话技术就是用来临时保存数据的。
2、会话技术的分类
- Cookie
cookie是一种客户端技术,程序可以把每一个用户特有的数据,以响应头set-cookie发送给每一个用户的浏览器,那最终会以文件的形式保存在用户的硬盘上,当用户再次使用浏览器来访问我们的WEB服务器,用户的浏览器会带上他特有的数据,而我们的程序所处理的则是来访用户特有的数据。
cookie存在浏览器,由服务器创建,随着响应带到浏览器,然后浏览器做临时保存,保存完之后,下次请求再带回去。
优点:减少服务器的压力,服务器内存可以少用一点
缺点:
(1)换一个浏览器后cookie就无法获取;
(2)随时都会被清理,适合保存不重要的东西;
(3)带来带去,占用带宽,适合存小的东西,如果过大,用户等待的时间很长;
(4)数据传来传去,不安全
总结:不必要的,比较小的,不涉及安全性的内容,用cookie - session
session是一种服务器技术,WEB服务器会在运行时为每一个用户的每一个会话创建一个其独享的HttpSession对象,由于Session对象是用户独享的,所以我们可以使用session对象来保存用户在一个会话过程中所产生的数据。
session对象是一个域对象,通过setAttribute、getAttribute和removeAttribute保存查询删除数据。
二、Cookie应用案例——记录用户上次访问的时间
步骤:
(1)获取指定的cookie信息
(2)判断是否为null
如果为null,给出提示信息
否则获取上次访问时间,并显示
(3)获取当前的时间存入cookie中,发到客户端
package com.itheima.cookie;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CookieDemo extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置响应类型和编码
response.setContentType("text/html;charset=UTF-8");
//获取输出流
PrintWriter out = response.getWriter();
//获取cookie信息
Cookie[] cookies = request.getCookies();
Cookie cookie = null;
if(cookies != null){
for (int i = 0; i < cookies.length; i++) {
String name = cookies[i].getName();
if("lastAccessTime".equals(name)){
cookie = cookies[i];
break;
}
}
}
//判断是否有上次访问时间
if(cookie == null){
//如果没有上次的访问时间,需要给出提示信息
out.println("欢迎第一次访问");
}else{
//如果有上次访问的时间,获取上次访问时间,并显示
String value = cookie.getValue();
out.print("您上次访问的时间为"+value);
}
//获取本次访问的时间
SimpleDateFormat sdf= new SimpleDateFormat("yy-MM-dd HH:mm:ss");
String now = sdf.format(new Date());
//创建cookie对象
Cookie c = new Cookie("lastAccessTime", now);
//记录用户访问时间,发送至客户端
response.addCookie(c);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
第一次访问
再次访问
案例的优化
如果我们在获取指定cookie对象时,每次都要写遍历整个集合的代码,这样非常麻烦,我们可以将获取指定cookie对象的方法封装到一个工具类中,直接调用方法获取指定的cookie对象。
CookieUtils
import javax.servlet.http.Cookie;
public class CookieUtils {
private CookieUtils(){}
public static Cookie getCookie(Cookie[] cookies,String name){
Cookie cookie = null;
if(cookies != null){
for (int i = 0; i < cookies.length; i++) {
String cookieName = cookies[i].getName();
if(cookieName.equals(name)){
cookie = cookies[i];
}
}
}
return cookie;
}
}
改写案例
import javax.servlet.http.Cookie;
public class CookieUtils {
private CookieUtils(){}
public static Cookie getCookie(Cookie[] cookies,String name){
Cookie cookie = null;
if(cookies != null){
for (int i = 0; i < cookies.length; i++) {
String cookieName = cookies[i].getName();
if(cookieName.equals(name)){
cookie = cookies[i];
}
}
}
return cookie;
}
}
三、Cookie的常用方法
1、构造方法
Cookie常用的构造方法有两个参数,对应cookie对象了name和value属性。
Cookie(String name,String value);
2、获取名称
作用:获取cookie对象的name属性
返回值:String类型的字符串
String getName();
3、获取值
作用:获取cookie对象的value属性
返回值:String类型的字符串
String getValue();
4、设置有效时间(过期时间)
作用:设置cookie对象的有效时间,参数以毫秒为单位
返回值:void
//有效期一天
cookie.setMaxAge(60 * 60 * 24);
//当浏览器关闭,会话结束后cookie会自动的被删除
cookie.setMaxAge(-1);
//cookie会立刻被删除
cookie.setMaxAge(0);
//最长的有效时间
cookie.setMaxAge(Integer.MAX_VALUE);
5、设置路径
作用:设置cookie对象的保存路径
返回值:void
//cookie的默认路径是当前WEB应用的根路径
cookie.setPath("/myCookie");
//推荐使用这个方法,比较灵活
cookie.setPath(request.getContextPath());
四、Cookie的细节
- 一个cookie只能用来标识一种信息,而cookie至少需要包含这个信息的名称和值;
- 一个网站可以向一个浏览器提供多个cookie,而一个浏览器也可以接收多个网站提供的cookie
- 一个浏览器一般最多可以接受300个cookie,一个网站所对应的cookie最多为20个,一个cookie大小限制为4kb
- 创建一个cookie对象,发送至客户端,那这个cookie他默认的级别是会话级别
会话级别:当用户关闭浏览器,会话结束了,那这个cookie也被删除了
如果需要把cookie保存在用户的硬盘上,需要设置cookie的有效时间(过期时间) - cookie的名称和值都不可以使用中文,因为中文被认为是不安全的字符
网友评论