参考资料及API:http://www.cnblogs.com/xdp-gacl/tag/JavaWeb%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93/
浏览器只能操作cookie,服务端既可以操作cookie,也可以操作session。原则上浏览器会将本地保存的cookie值在发送请求时携带上,携带标准是根据“域+路径“确定,且出于安全考虑,不允许跨域携带。区分是否是同一个域由协议+ip+端口确定。
1、会话,理解为浏览器的一次打开和关闭操作。
上述截图中的域和路径决定了该cookie适用的请求URL。过期时间为:浏览会话结束时(浏览器关闭时)。
2、Cookie技术
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,在一次会话尚未结束时,(若如果设置了cookie的存活时间,那么即使会话结束,在cookie的有效期内,浏览器会依据域和路径的组合,去本地磁盘上匹配已保持的cookie,一并发送给服务器)浏览器会将缓存中的cookie以请求头中参数的形式发送给web服务器,实现请求状态的标记。
在上面的截图中可以发现,虽然设置了一个名字为date失效期为21天的cookie,但并不会在访问百度这个域时发送这个cookie。证明了cookie的发送会经过域和路径的一个筛选。
在谷歌浏览器上可以查看该浏览器保存的所有的cookie:
3、验证cookie的创建和刷新。
codeview:
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.*; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; @WebServlet(urlPatterns={"/test/cookie"}) public class CookieTest extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setCharacterEncoding("utf-8"); resp.setHeader("content-type","text/html;charset=utf-8"); PrintWriter out = resp.getWriter(); // 获取请求中的cookie Cookie[] cookies = req.getCookies(); if (null != cookies) { for (Cookie temp : cookies) { if ("date".equals(temp.getName())) { out.print(" 浏览器保存的名为date的cookie:"+temp.getValue()); } } } else { out.print("你是第一次访问该网站"); } //实现cookie的刷新 Cookie cookie = new Cookie("date",new Date().toLocaleString()); resp.addCookie(cookie); /* PrintWriter out = resp.getWriter(); HttpSession session = req.getSession(); String ID = session.getId(); Cookie cookie = new Cookie("date","This is cookie "); // 设置cookie存活的时间,设置了存活时间,不会应为会话的结束而失效. cookie.setMaxAge(30*60*1000); resp.addCookie(cookie); */ } }
4、
session为服务端技术,web服务器可以为一个浏览器创建一个会话对象(session对像),一个浏览器独占一个session对象(默认情况下),。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
- Cookie是把用户的数据写给用户的浏览器。
- Session技术把用户的数据写到用户独占的session中。
- Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。
- 服务器创建session出来后,会把session的id号,以cookie的形式回写给客户机,这样,只要客户机的浏览器不关,再去访问服务器时,都会带着session的id号去,服务器发现客户机浏览器带session id过来了,就会使用内存中与之对应的session为之服务。