Web开发之Cookie and Session

会话

什么是会话?

简单说:用户开一个浏览器,点击多个超链接,访问服务器的多个web资源,然后关闭浏览器,整个过程就称之为一个会话。

会话过程要解决什么问题

  • 每个用户在使用浏览器与服务器进行会话的过程中,都会产生一些数据,程序要想办法为每个用户保存这些数据
  • 例如:用户点击超链接通过一个servlet购买了一个商品,程序应该想办法保存用户购买的商品,以便用户点结账servlet时,结账servlet可以得到用户购买的商品为用户结账。

Cookie的属性

  1. name:Cookie的名字
  2. value:Cookie的值
  3. path:Cookie的存储路径,默认是访问的Servlet所在路径(可选)
  4. MaxAge:最大的存活时间,默认是存放在缓存区中的,生命周期就是一个会话(可选)
  5. version:Cookie的版本
  6. domain:域名(哪个网站)
  7. Comment:备注

Cookie的相关用法

程序为:记录上次访问的时间

  • ServletCookie1中

    request.setCharacterEncoding("UTF-8");
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    
    out.write("您上次访问的时间是:");
    //拿到客户端携带的记录上次访问时间的Cookie:假设Cookie的名字是lastaccesstime,值是一个long类型的值
    //拿到客户端携带的所有的Cookie
    Cookie[] cs = request.getCookies();
    //循环判断拿到需要的Cookie
    for (int i=0; cs!=null && i<cs.length; i++){
        Cookie c = cs[i];
        if(c.getName().equals("lastaccesstime")){
            //说明找到了需要的Cookie
            String time = c.getValue();
            //将time转化为long类型的值
            long t = Long.parseLong(time);
            //格式化为我们需要的格式
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            //创建一个date对象
            Date d = new Date(t);
            //将数据输出到页面
            out.write(sdf.format(d) + "&nbsp;&nbsp;
                <a href = 'request.getContextPath()+"/servlet/ServletCookie2"'>清除Cookie</a>");
        }
        //向客户端发送Cookie
        Cookie c = new Cookie("lastaccesstime", new Date().getTime() + "");
    
        //设置Cookie的存活时间
        //(只要设置了此时间,此Cookie就将存储到客户端的硬盘上,不会在缓存中存储)
        c.setMaxAge(Integer.MAX_VALUE);
    
        //设置浏览器携带Cookie的路径
        c.setPath(request.getContextPath());        
    
        //设置路径如果是/,意味着访问服务器上的任意工程资源都会携带此Cookie
        //c.setPath("/");   //此路径是服务器的根路径:协议+主机名+端口号
    
        //发送到客户端
        response.addCookie(c);
    }
    
  • ServletCookie2中(删除存储的Cookie)

    //sun公司没有提供相应的方法
    //所以创建一个同名的cookie,将存活时间设置为0即可,然后覆盖客户端存储的cookie
    Cookie c = new Cookie("lastaccesstime","");
    c.setMaxAge(0);
    
    //设置路径
    c.setPath(request.getContextPath());
    
    //发送到客户端
    response.addCookie(c);
    
  • ServletCookie3(演示path的含义)

    path的含义:默认情况下,客户端存储的Cookie的路径就是发送Cookie的Servlet的路径

    //拿到客户端所有的Cookie
    Cookies[] cs = request.getCookies();
    //拿到记录上次访问时间的Cookies        
    for(int i=0; cs!=null && i<cs.length; i++)  {
        Cookie c = cs[i];
        if(c.getName().equals("lastaccesstime")){
            String value = c.getValue();                
            out.write(value);
        }
    }
    

Cookie应用:记住用户名密码

  • ServletUI中:

    创建一个登录页面

        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
    
        //拿到错误信息
        String error = (String)request.getAttribute("error");
        if(error != null)
            out.write("<font color = red>" +error+ "</font>");
    
        String username="";
        String pass = "";
    
        //拿到客户端携带的所有Cookie
        Cookie[] cs = request.getCookies();
        //循环判断
        for(int i=0; cs!=null && i<cs.length; i++){
            Cookie c = cs[i];
            if(c.getName().equals("name")){
                //说明找到了存储用户名的cookie
                username = c.getValue();
            }
            if(c.getName().equals("pass"))
                //说明找到了存储密码的cookie
                pass = c.getValue();
        }
    
        //创建登录页面
        out.write("<form action = '" + request.getContextPath() + 
                "/servlet/LoginServlet"' method = 'post'>");
        out.write("姓名:<input type = 'text' name = 'username' value = '"+ username + "'><br>");
        out.write("密码:<input type = 'text' name = 'password' value = '"+ pass + "'><br>");
        out.write("<input type = 'checkbox' 
            name = 'remember' value = 'on'>记住用户名及密码两周<br>");
        out.write("<input type = 'submit' value = '登录'><br>");
    
  • LoginServlet中:

    1.判断用户是否是合法用户

    2.看用户是否选择了记录用户名和密码

        //拿取浏览器传递的数据
        String name = request.getParameter("username");
        String pass = request.getParameter("password");
        String remember = request.getParameter("remember");
    
        //判断用户是否是合法用户:假定name和pass的依序一样就是合法
        //拿到密码的逆序
        String pass1 = new StringBuffer(pass).reverse().toString();
    
        //判断
        if(name.equals(pass1)){
            //表示合法
    
            Cookie c = new Cookie("name",name);
            Cookie c1 = new Cookie("pass",pass);
    
            //判断用户是否选择了记住用户名和密码
            if("on".equals(remember)){
                //说明用户选择了记录
    
                //设定存储到客户端的硬盘上
                c.setMaxAge(Integer.MAX_VALUE);
                c1.setMaxAge(Integer.MAX_VALUE);
            }else{
                //设定客户端存储的用户名和密码立刻失效
                c.setMaxAge(0);
                c1.setMaxAge(0);
            }
            //设定访问路径
            c.setPath(request.getContextPath());
            c1.setPath(request.getContextPath());
    
            //向客户端发送Cookie
            response.addCookie(c);
            response.addCookie(c1);
    
            request.setAttribute("name", name);
            request.getRequestDispatcher("MainServlet").forward(request, response);
        }else{
            //非法用户
            request.setAttribute("error", "用户名或密码错误");
            request.getRequestDispatcher("ServletUI").forward(request,response);
        }
    
  • MainServlet中:

        String name = (String)request.getAttribute("name");
    
        out.write(name + "欢迎你");
    

Session(也是域对象)

在Web开发中,服务器为每个用户创建一个会话对象(session对象),即一个浏览器独占一个session对象(默认)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。

创建session

  • Servlet1

    1.看客户端是否携带了JSESSIONIDCookie

    2.如果没有携带,创建一个新的session对象,并分配一个唯一的id,发送到客户端,存储在客户端的缓存中;

    如果携带了,将根据cookie的值(id)到服务器的内存中寻找session,如果找到了则返回此session为客户端服务,如果找不到,则创建新的session对象,并分配一个唯一的id,发送到客户端,存储在客户端的缓存中

    HttpSession session = request.getSesstion();
    String id = session.getId();
    System.out.println("id:" + id);
    session.setAttribute("name", "Tryking");
    
  • Servlet2

    如果先访问1,不关浏览器再访问2。则两个id的值是一样的

    HttpSession session = request.getSession();
    String id = session.getId();
    System.out.println("id:" + id);
    String name = (String)session.getAttribute("name");
    

转载于:https://www.cnblogs.com/dengkaiting/p/11069390.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值