cookie和session

参考资料及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为之服务。

原文地址:https://www.cnblogs.com/nevegiveup/p/7445612.html