1.会话技术的概念
- 会话∶浏览器和服务器之间的多次请求和响应。
- 为了实现一些功能,浏览器和服务器之间可能会产生多次的请求和响应,从浏览器访问服务器开始,到访问服务器结束(关闭浏览器、到了过期时间)。这期问产生的多次请求和响应加在一起就称之为浏览器和服务器之间的一次会话。
- 会话过程中所产生的一些数据,可以通过会话技术( Cookie和Session )保存。
2.Cookie的概念
- Cookie :客户端会话管理技术把要共享的数据保存到客户端。
- 每次请求时,把会话信息带到服务器端,从而实现多次请求的数据共享!
- 作用:可以保存客户端访问网站的相关内容,从而保证每次访问时先从本地缓存中就取,以此提高效率
- -cookie有大小和个数限制:每个网站最多只能存20个Cookie,所有网站加起来最多只能存300个Cookie。每个Cookie的大小不能超过4KB
3.Cookie的添加和获取
//cookie把数据保存在客户端
//Session把数据保存在服务端,且依赖于cookie
@WebServlet("/ServletDemo1")
public class ServletDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求字符编码,防止乱码
req.setCharacterEncoding("utf-8");
//设置浏览器响应编码[html类型的文本,字符集为utf-8]
resp.setContentType("text/html;charset=utf-8");
//1.通过响应对象写出提示信息
PrintWriter pw = resp.getWriter();
pw.write("最后浏览时间为<br/>");
//2.创建Cookie对象,用于记录最后访问时间
Cookie cookie = new Cookie("time", System.currentTimeMillis() + "");
//3.设置最大存活时间
cookie.setMaxAge(3600);
//4.将cookie对象添加到客户端
resp.addCookie(cookie);
//5.获取cookie
Cookie[] cookies = req.getCookies();
for (Cookie c : cookies) {
//if("time".equals(c.getName())){
if(c.getName().equals("time")){
String value = c.getValue();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
pw.write(sdf.format(new Date(Long.parseLong(value))));
}
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
4.Cookie的路径限制
【取自第一次访问的资源路径前缀,只要以这个前缀为开头(包括子级路径)。获取到反之获取不到】
@WebServlet("/servlet/aaa/ServletDemo4")可以获取到
@WebServlet("/bbb/servlet/ServletDemo5")不可以获取
//cookie的路径限制
@WebServlet("/servlet/ServletDemo3")
//取自第一次访问的资源路径前缀,只要以这个前缀为开头(包括子级路径)。获取到反之获取不到
public class ServletDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建Cookie并添加
Cookie cookie = new Cookie("username", "zhangsan");
cookie.setMaxAge(3600);//s
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
5.例子:最后浏览时间
@WebServlet("/ServletDemo2")
public class ServletDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求字符编码,防止乱码
req.setCharacterEncoding("utf-8");
//设置浏览器响应编码[html类型的文本,字符集为utf-8]
resp.setContentType("text/html;charset=utf-8");
//1.获取所有的Cookie对象
//需要加非空判断
PrintWriter pw = resp.getWriter();
Cookie[] cookies = req.getCookies();
if(cookies==null){
//如果为空,说明第一次访问,使用Cookie记录这一次访问的时间
Cookie cookie = new Cookie("lasttime", System.currentTimeMillis() + "");
cookie.setMaxAge(3);
resp.addCookie(cookie);
pw.write("欢迎光临,第一次访问");
return;
}
//2.查找lasttime名称的Cookie是否存在
int index = -1;
for (int i = 0; i < cookies.length; i++) {
//可以加个cookies[i]判空
if (cookies[i].getName().equals("lasttime")) {
index = i;
break;
}
}
//如果不存在,说明第一次访问,使用Cookie记录这一次访问的时间
if (index == -1) {
Cookie cookie = new Cookie("lasttime", System.currentTimeMillis() + "");
cookie.setMaxAge(3);
resp.addCookie(cookie);
pw.write("欢迎光临,第一次访问");
}
//如果存在,说明不是第一次访问,使用Cookie响应给浏览器这一次的时间
if (index != -1) {
String value = cookies[index].getValue();
SimpleDateFormat sdt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
pw.write("欢迎回来,上次访问时间</br>" + sdt.format(new Date(Long.parseLong(value))));
//并设置新时间
cookies[index].setValue(System.currentTimeMillis() + "");
resp.addCookie(cookies[index]);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}