美文网首页
javaweb学习总结(四)使用cookie进行会话管理

javaweb学习总结(四)使用cookie进行会话管理

作者: Mr_Rains | 来源:发表于2018-04-08 15:59 被阅读0次
一、会话的概念

会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。
  有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾经来过,这称之为有状态会话。

二、会话过程中要解决的一些问题?

每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据。

三、保存会话数据的两种技术
3.1、Cookie

Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。

3.2、Session

Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

四、Java提供的操作Cookie的API

String getComment()返回cookie中注释,如果没有注释的话将返回空值.

String getDomain() 返回cookie中Cookie适用的域名. 使用getDomain() 方法可以指示浏览器把Cookie返回给同 一域内的其他服务器,而通常Cookie只返回给与发送它的服务器名字完全相同的服务器。注意域名必须以点开始(例如.yesky.com)

int getMaxAge() 返回Cookie过期之前的最大时间,以秒计算。

String getName()返回Cookie的名字。名字和值是我们始终关心的两个部分,笔者会在后面详细介绍 getName/setName。

String getPath()返回Cookie适用的路径。如果不指定路径,Cookie将返回给当前页面所在目录及其子目录下 的所有页面。

boolean getSecure() 如果浏览器通过安全协议发送cookies将返回true值,如果浏览器使用标准协议则返回false值。

String getValue() 返回Cookie的值。笔者也将在后面详细介绍getValue/setValue。

int getVersion() 返回Cookie所遵从的协议版本。

void setComment(String purpose) 设置cookie中注释。

void setDomain(String pattern) 设置cookie中Cookie适用的域名

void setMaxAge(int expiry) 以秒计算,设置Cookie过期时间。

void setPath(String uri) 指定Cookie适用的路径。

void setSecure(boolean flag) 指出浏览器使用的安全协议,例如HTTPS或SSL。

void setValue(String newValue) cookie创建后设置一个新的值。

void setVersion(int v) 设置Cookie所遵从的协议版本。

五、Cookie使用范例
5.1、使用cookie记录用户上一次访问的时间
package rain.cookie.study;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class CookieDemo1
 * cookie实例:获取用户上一次访问的时间
 */
@WebServlet("/CookieDemo1")
public class CookieDemo1 extends HttpServlet {
    private static final long serialVersionUID = 1L;


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置服务端以UTF-8编码进行输出
        response.setCharacterEncoding("utf-8");
        //设置客户端以UTF-8进行接收,解决中文乱码问题
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        //获取浏览器访问服务器时传递过来的cookie数组
        Cookie[] cookies = request.getCookies();
        if(cookies != null) {
            out.write("您上次访问的时间是:");
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                if(cookie.getName().equals("lastAccessTime")) {
                    long lastTime = Long.parseLong(cookie.getValue());
                    Date date = new Date(lastTime);
                    out.write(date.toLocaleString());
                }
            }
        }else {
            out.write("这是您第一次访问本站!");
        }
    
        //用户访问过之后  要重新将时间存储到cookie中,然后发送给客户端
        Cookie cookie = new Cookie("lastAccessTime",System.currentTimeMillis()+"");
        //将cookie添加到Response对象中 发送给客户端
        response.addCookie(cookie);
    }


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        doGet(request, response);
    }

}

运行结果:


image.png image.png

在上面的例子中,在程序代码中并没有使用setMaxAge方法设置cookie的有效期,所以当关闭浏览器之后,cookie就失效了,要想在关闭了浏览器之后,cookie依然有效,那么在创建cookie时,就要为cookie设置一个有效期。如下所示:

//用户访问过之后 要重新将时间存储到cookie中,然后发送给客户端

        Cookie cookie = new Cookie("lastAccessTime",System.currentTimeMillis()+"");
         //设置Cookie的有效期为1天
        cookie.setMaxAge(24*60*60);
        //将cookie添加到Response对象中 发送给客户端
        response.addCookie(cookie);
六、Cookie存储中文

如果要在cookie里面存储中文,必须先进行编码,需要用到的一个类是URLEncoder里面的URLDecoder.decode(String s, String enc),否则就会挂掉。程序将会抛出java.lang.IllegalArgumentException 异常。正确的做法是:

Cookie cookie = new Cookie("username",URLEncoder.encode("我是张三", "utf-8"));
response.addCookie(cookie);

在获取cookie里面的中文数据时,再使用URLDecoder里面的URLDecoder.decode(String s, String enc)进行解码。如下

URLDecoder.decode(value, "utf-8")

相关文章

  • javaweb学习总结(四)使用cookie进行会话管理

    一、会话的概念 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个...

  • 会话管理

    会话? 使用Cookie实现会话管理 HttpSession HttpSession原理

  • JavaWeb--会话Cookie

    会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求...

  • cookie与本地存储

    cookie也叫HTTP Cookie,最初是客户端与服务器端进行会话使用的 document.cookie = ...

  • Cookie和Session

    本篇文章简单记录了关于Web会话管理技术的学习笔记。目前常用的会话管理技术是Cookie与SessionCooki...

  • java基础参考资料

    JavaWeb学习总结(一)——JavaWeb开发入门 JavaWeb学习总结(二)——Tomcat服务器学习和使...

  • day12_编码实战&Jsp基础

    1课程回顾 会话管理 1)会话管理:管理浏览器和服务器之间的会话过程中产生的会话数据 2)Cookie技术:会话数...

  • 16.Cookie&Session

    主要内容 会话技术1. Cookie2. Session JSP:入门学习 会话技术 Cookie: ​2. 不同...

  • 会话管理----cookie

    2.1 软件中的会话 一次会话: 打开浏览器 -> 访问一些服务器内容 -> 关闭浏览器 登录场景: 打开浏览器 ...

  • JavaScript之cookie

    cookie 也叫 HTTP Cookie, 最初是客户端与服务器端进行会话使用的。 比如, 会员登录,下次回访网...

网友评论

      本文标题:javaweb学习总结(四)使用cookie进行会话管理

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