一、会话技术
啥是会话技术?
.浏览器开始访问网站到访问网站结束期间产生的多次请求响应组合在一起叫做一次会话
会话的过程中会产生会话相关的数据,我们需要将这些数据保存起来。
简单来说就是浏览器开启到关闭的过程
出现的问题:
我们如何保存里面的数据,比如购物的订单数、价格。
出现了两种技术可以解决
一种是客户端技术Cookie,一种是服务端技术Session
二、Cookie技术
概念:
Cookie是基于set-Cookie响应头和Cookie请求头工作的,服务器可以发送set-Cookie请求头命令浏览器保存
一个cookie信息,浏览器会在访问服务器时以Cookie请求头的方式带回之前保存的信息
上面是什么鬼意思?
可以这样子理解:
服务器发送信息给浏览器,要求浏览器保存一些信息在本地文件夹中,当浏览器访问时服务器时再把信息反馈给浏览器
1、默认有的Cookie
package com.java.cookies;
import java.io.IOException;
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 CookieDemo1 extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
Cookie [] cs=request.getCookies();
for(int i=0;i<cs.length;i++){
response.getWriter().write(""+cs[i].getName()+"------"+cs[i].getValue());
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
浏览器会输出:
JSESSIONID------1E046E2DD3F043DFCF40CB63CAFAEB4A
jsession是什么:jsessionid是session的标识。这就好比每个人都有身份证一样。
为什么会有jsessionid,这个东东有什么用呢?
这是一个保险措施 因为Session默认是需要Cookie支持的,但有些客户浏览器是关闭Cookie的【而jsessionid是存储在Cookie中的,如果禁用Cookie的话,也就是说服务器那边得不到jsessionid,这样也就没法根据jsessionid获得对应的session了,获得不了session就得不到session中存储的数据了。】 这个时候就需要在URL中指定服务器上的session标识,也就是类似于“jsessionid=5F4771183629C9834F8382E23BE13C4C” 这种格式。 用一个方法(忘了方法的名字)处理URL串就可以得到这个东西,这个方法会判断你的浏览器是否开启了Cookie,如果他认为应该加他就会加上去。可以看出,我们只有一个默认的Cookie,那么我们如何再增加一个Cookie呢?可以看下面:
package com.java.cookies;
import java.io.IOException;
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 CookieDemo1 extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//增加Cookie的代码
Date d=new Date();
Cookie c=new Cookie("LastTime",d.getTime()+"");
response.addCookie(c);
Cookie [] cs=request.getCookies();
for(int i=0;i<cs.length;i++){
response.getWriter().write(""+cs[i].getName()+"------"+cs[i].getValue());
response.getWriter().write("<br/>");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
这个时候浏览器就会输出:
LastTime------1434558472795
JSESSIONID------1E046E2DD3F043DFCF40CB63CAFAEB4A
显然这里面有两个Cookie
三、cookie类常见的方法
我们可以看下面的一个案例:
package com.java.cookies;
import java.io.IOException;
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 CookieDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
Cookie [] cs = request.getCookies();
Cookie findC = null;
if(cs!=null){
for(int i=0;i<cs.length;i++){
if("lastTime".equals(cs[i].getName())){
findC = cs[i];
}
}
}
if(findC == null){
response.getWriter().write("您是第一次访问本网站!");
}else{
long lastTime = Long.parseLong(findC.getValue());
response.getWriter().write("您上次访问时间是:"+new Date(lastTime).toLocaleString());
}
Date date = new Date();
Cookie c = new Cookie("lastTime",date.getTime()+"");
// c.setMaxAge(3600*24*30);
c.setPath(request.getContextPath());
//c.setDomain(".baidu.com");
response.addCookie(c);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
上面是一个记录登陆时间的程序?
如果是第一次登陆那么就会在浏览器上打出:
您是第一次访问本网站!
如果再刷新就会显示访问时间
注意如果将这段代码消掉的话会发生什么作用?
c.setMaxAge(3600*24*30);
当关掉浏览器再上线的时候就会显示:
您是第一次访问本网站”
这是为什么?
看它的概念:
一个Cookie如果没有设置过MaxAge则这个Cookie是一个会话级别的Cookie,这个Cookie信息打给浏览器后浏览器会将它保存在浏览器的内存中,这意味着只要浏览器已关闭随着浏览器内存的销毁Cookie信息也就消失了.一个Cookie也可以设置MaxAge,浏览一一旦发现收到的Cookie被设置了MaxAge,则会将这个Cookie信息以文件的形式保存在浏览器的临时文件夹中,保存到指定的时间到来位置.这样一来即使多次开关浏览器,由于这些浏览器都能在临时文件夹中看到cookie文件,所以在cookie失效之前cookie信息都存在.
-- 想要命令浏览器删除一个Cookie,发送一个同名同path的cookie,maxage设置为0,浏览器以名字+path识别cookie,发现同名同path,cookie覆盖后立即超时被删除,从而就删除了cookie.
这是cookie的生命值:上面的含义是保存一个月
另外 ,下面是啥意思?
c.setDomain(".baidu.com");
我也不懂,反正不要设置它,假如设置它,那么浏览器就不会理会cookie了
这是它的概念:
setDomain与getDomain方法
-- 用来通知浏览器在访问哪个域名的时候带着当前的cookie信息.但是要注意,现代的浏览器一旦发现cookie设置过domain信息则会拒绝接受这个Cookie.我们平常不要设置这个方法