美文网首页java web
Java Web(4)Cookie与Session

Java Web(4)Cookie与Session

作者: loserwang_3030 | 来源:发表于2020-07-12 13:50 被阅读0次

    Java Web三大作用域对象:

    • HttpServletRequest
    • HttpSession
    • ServletContext

    1.Session与Cookie

    1.1 Session

    A session is a group of user interactions with your website that take place within a given time frame.

    会话是在给定时间范围内发生的一组用户与网站的互动。
    在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
    Session的数据存储在Tomcat服务器的内存中,具有时效性。

    1.2 Cookie

    cookie 是一个非常具体的东西,指的就是浏览器里面能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能。
    服务器生成cookie,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。由于cookie是存在客户端上的,所以浏览器加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的cookie数量是有限的。
    有了Cookie这样的技术实现,服务器在接收到来自客户端浏览器的请求之后,就能够通过分析存放于请求头的Cookie得到客户端特有的信息,从而动态生成与该客户端相对应的内容。

    Cookie的方法

    javax.servlet.http.Cookie; 描述
    public void setDomain(String pattern) 设置 cookie 的域名,比如 loserwang.com
    public String getDomain() 获取 cookie 的域名,比如loserwamg.com
    public void setMaxAge(int expiry) 设置 cookie 有效期,以秒为单位,默认有效期为当前session的存活时间
    public int getMaxAge() 获取 cookie 有效期,以秒为单位,默认为-1 ,表明cookie会活到浏览器关闭为止
    public String getName() 返回 cookie 的名称,名称创建后将不能被修改
    public void setValue(String newValue) 设置 cookie 的值
    public String getValue() 获取cookie的值
    public void setPath(String uri) 设置 cookie 的路径,默认为当前页面目录下的所有 URL,还有此目录下的所有子目录
    public String getPath() 获取 cookie 的路径
    public void setSecure(boolean flag) 指明 cookie 是否要加密传输
    public void setComment(String purpose) 设置注释描述 cookie 的目的。当浏览器将 cookie 展现给用户时,注释将会变得非常有用
    public String getComment() 返回描述 cookie 目的的注释,若没有则返回 null

    实现Cookie

    //(1) 创建一个 Cookie 对象
    Cookie cookie = new Cookie("key","value");
    //(2) 设置最大生存周期
    cookie.setMaxAge(60*60*24); 
    //(3) 发送 Cookie 到 HTTP 响应头
    response.addCookie(cookie);
    

    中文编码

    Servlet Cookie 处理需要对中文进行编码与解码,方法如下:

    String   str   =   java.net.URLEncoder.encode("中文","UTF-8");            //编码
    String   str   =   java.net.URLDecoder.decode("编码后的字符串","UTF-8");   // 解码
    

    1.3 Session跟踪

    Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。
    每一个Session都有其Sessiond,浏览器和服务器之间通过SessionID进行跟踪会话,有以下三种方式来维持 Web 客户端和 Web 服务器之间的 session 会话

    • Cookie : 一个 Web 服务器可以分配一个唯一的 session 会话 ID 作为每个 Web 客户端的 cookie,对于客户端的后续请求可以使用接收到的 cookie 来识别。这可能不是一个有效的方法,因为很多浏览器不支持 cookie,所以我们建议不要使用这种方式来维持 session 会话。
    • URL 重写 : 您可以在每个 URL 末尾追加一些额外的数据来标识 session 会话,服务器会把该 session 会话标识符与已存储的有关 session 会话的数据相关联。例如,http://w3cschool.cc/file.htm;sessionid=12345
    • 隐藏的表单字段 : 一个 Web 服务器可以发送一个隐藏的 HTML 表单字段,以及一个唯一的 session 会话 ID,如下所示:
    <input type="hidden" name="sessionid" value="12345">
    

    1.4 HttpSession 对象

    javax.servlet.http.HttpSession ; 描述
    public Object getAttribute(String name) 该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null。
    public Enumeration getAttributeNames() 该方法返回 String 对象的枚举,String 对象包含所有绑定到该 session 会话的对象的名称。
    public long getCreationTime() 该方法返回该 session 会话被创建的时间,自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。
    public String getId() 该方法返回一个包含分配给该 session 会话的唯一标识符的字符串。
    public long getLastAccessedTime() 该方法返回客户端最后一次发送与该 session 会话相关的请求的时间自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。
    public int getMaxInactiveInterval() 该方法返回 Servlet 容器在客户端访问时保持 session 会话打开的最大时间间隔,以秒为单位。
    public void invalidate() 该方法指示该 session 会话无效,并解除绑定到它上面的任何对象。
    public boolean isNew() 如果客户端还不知道该 session 会话,或者如果客户选择不参入该 session 会话,则该方法返回 true。
    public void removeAttribute(String name) 该方法将从该 session 会话移除指定名称的对象。
    public void setAttribute(String name, Object value) 该方法使用指定的名称绑定一个对象到该 session 会话。
    public void setMaxInactiveInterval(int interval) 该方法在 Servlet 容器指示该 session 会话无效之前,指定客户端请求之间的时间,以秒为单位。

    HttpSessiony原理:
    Tomcat服务器会自动为每一个浏览器请求创建一个有SessionId的Session,然后每次以Cookie的形式将SeesionId返回浏览器,浏览器下次访问就携带这个Cookie:

    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //接受请求发来的参数
           String name = req.getParameter("name");
           String password = req.getParameter("password");
            HttpSession session = req.getSession();
            session.setAttribute("name", name);
            session.setAttribute("password", password);
    
            resp.getWriter().println("<p>name : " + name + "</p>" );
            resp.getWriter().println("<p>password : " + password + "</p>" );
            System.out.println(session.getId());
        }
    

    当访问相应网页后,结果如下:


    浏览器收到Cookie.png
    浏览器收到Cookie.png

    相关文章

      网友评论

        本文标题:Java Web(4)Cookie与Session

        本文链接:https://www.haomeiwen.com/subject/wytmcktx.html