会话技术
会话技术常用的有两种: Cookie技术,Session技术,这两种技术是有区别的.
Cookie : 会话数据会保存在浏览器客户端
Session技术: 会话数据会保存在服务器端
Cookie技术
特点
Cookie技术,会话数据保存在浏览器客户端
Cookie核心技术
Cookie类: 用于存储会话数据的类.
核心方法:
构造方法
1. Cookie(String name,String value); // 构造方法
设置cookie方法:
2. void setPath(String uri); // 设置cookie的有效访问路径
3. void setMaxAge(int expiry); // 设置cookie的有效时间
4.void setValue(String newValue); // 设置cookie的值
发送Cookie到浏览器端保存
//在服务器创建Cookie,但服务器并不保存Cookie数据,而是把Cookie数据发送到浏览器端进行保存
5. void response.addCookie(Cookie cookie); // 发送cookie
服务器接收Cookie信息
// 被保存在浏览器的Cookie信息是可以发送回服务器端的.
6.Cookie[ ] request.getCookies(); // 用于接收浏览器端发送的Cookie信息
Cookie原理
-
服务器创建Cookie对象,把会话数据储存在Cookie对象中.
new Cookie("name',"eli");
-
服务器发送Cookie信息到浏览器
// 通过set-cookie响应头,将数据发送给浏览器 response.addCookie(cookie);
浏览器得到服务器发送的Cookie,然后保存在浏览器端
浏览器在下次访问服务器时,会通过cookie请求头自动携带被保存的cookie信息
-
服务器可以接收到浏览器携带有Cookie信息的请求信息
Cookie cookies[ ] = request.getCookies();
Cookie的细节
setPath()
// 设置Cookie的有效访问路径
void setPath(String url);
有效路径指的是:Cookie可被浏览器找的路径,在Cookie被保存在可被浏览器找到的位置的情况下,浏览器在访问服务器时就会携带Cookie信息,否则就不带.
默认情况下,Cookie的有效路径在当前的web应用下,(/FileReadWrite)
setMaxAge()
// 设置Cookie的有效时间
void setMaxAge(int expiry);
-
正整数: 表示将Cookie数据保存在浏览器的缓存目录中(硬盘中),数值的大小表示存储的时间
以秒为单位,从最后一次请求含有Cookie信息页面后开始计算. 如果在单位时间内再次请求,则会刷新Cookie时间,重新开始计算
负整数: 表示将Cookie数据保存在浏览器的内存中,浏览器关闭Cookie就会丢失.
零 : 表示删除同名Cookie数据
Cookie的局限性
- Cookie只能保存非中文的字符串数据类型,,
- Cookie的保存个数和大小是有限制的.
- 浏览器一般只允许存放300个Cookie
- 每个站点最多存放20个Cookie
- 每个Cookie的大小限制为4KB
Cookie使用案例
案例1 显示用户上次访问的时间
需求
- 首次访问显示: 您是首次访问本网站,当前时间为 : 2017/11/15 14:10
- 第n次访问显示: 欢迎回来,您上次访问的时间为 : 2017/11/15 14:10, 当前时间为 : 2017/11/15 14:12
使用Cookie方式实现
public class HistServlet extends HttpServlet {
/**
* 需求
* 1. 首次访问显示: 您是首次访问本网站,当前时间为 : 2017/11/15 14:10
* 2. 第n次访问显示: 欢迎回来,您上次访问的时间为 : 2017/11/15 14:10, 当前时间为 : 2017/11/15 14:12
*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
setEncoding(request, response);
// 获取当前时间
String curTime = getCurrentTime();
// 判断是否是第一次登录
if (isFirstVisit(request)) {
response.getWriter().write("您是首次访问本网站,当前时间为" + curTime);
getLastTimeAndSaveCurrentTime(request, response, curTime);
} else {
response.getWriter().write("欢迎回来,您上次访问的时间为 : " +
getLastTimeAndSaveCurrentTime(request, response, curTime) +
", 当前时间为 :" + curTime);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
/**
* 设置请求编码响应
* @param request
* @param response
* @throws UnsupportedEncodingException
*/
private void setEncoding(HttpServletRequest request, HttpServletResponse response)
throws UnsupportedEncodingException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
}
/**
* 是否是第一次访问本网站
* @param cookies 请求中携带的Cookie数组
* @return 如果是第一次访问返回true 否则返回false
*/
private boolean isFirstVisit(HttpServletRequest request) {
Cookie[] cookies = request.getCookies();
String lastTimeString = null;
boolean isFirstVisit = true;
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("lastTime".equals(cookie.getName())) {
isFirstVisit = false;
break;
}
}
} else {
isFirstVisit = true;
}
return isFirstVisit;
}
/**
*
* @param curTime
* 本次访问的时间
* @return 返回上一次访问的时间
*/
private String getLastTimeAndSaveCurrentTime(HttpServletRequest request, HttpServletResponse response,
String curTime) {
String lastTime = null;
// 找到名为lastTime的Cookie的值返回
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("lastTime".equals(cookie.getName())) {
lastTime = cookie.getValue();
}
}
}
// 保存当前请求时间,并将时间发送给浏览器
Cookie cookie = new Cookie("lastTime", curTime);
cookie.setMaxAge(86400);
response.addCookie(cookie);
return lastTime;
}
/**
* 获取当前时间,并将时间以yyyy-MM-dd hh:mm:ss的格式返回
*
* @return 返回系统当前时间
*/
private String getCurrentTime() {
String currentTime = null;
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
currentTime = dateFormat.format(new Date());
return currentTime;
}
}