20210123 javaWeb之Cookie Session 详解第三部分

七、Cookie Session

7.1 会话

会话(session):用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话

有状态会话 :一个同学来过教室,下次再来教室,我们会知道这个同学,曾经来过,称之为有状态会话

一个网站怎么证明你来过?

客户端 服务端

  1. 服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了:cookie
  2. 服务器登记你来过了,下次你来的时候我来匹配你;session

7.2 保存会话的两种技术

cookie

  • 客户端技术(响应,请求)

session

  • 服务端技术,利用这个技术,可以保存用户的会话信息?我们可以把信息或者数据放到Session中

7.3 Coolie

20210123 javaWeb之Cookie Session 详解第三部分_第1张图片

  1. 从请求中拿到cookie信息
  2. 服务器响应给客户端cookie
Cookie[] cookies = req.getCookies(); //请求获得到Cookie
cookie.getName();                    //获得cookie中的key
cookie.getValue();                   //获得cookie中的vlaue
new Cookie("lastLoginTime", System.currentTimeMillis() + ""); //新建一个cookie 日期+时间
cookie.setMaxAge(24*60*60);          //设置cookie的有限期
resp.addCookie(cookie);              //响应给客户端一个cookie

//界面乱码问题
URLDecoder.decode(cookie.getValue(),"utf-8");//解码
URLEncoder.encode("李四","utf-8");//编码

cookie一般会保存在本地的用户目录下appdata

一个网站cookie是否存在上限

  • 一个Cookie只能保存一个信息
  • 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
  • Cookie大小有限制4kb
  • 300个cookie浏览器上限

删除cookie

  • 不设置有限期,关闭浏览器,自动失效
  • 设置有效期时间为0

测试

//保存用户上一次访问的时间
public class CookieServlet extends HttpServlet {
     
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     
        //服务器告诉你,你来的时间,把这个时间封装成为一个信件,你下带来我就知道你来了
        //解决中文乱码
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        PrintWriter out = resp.getWriter();
        //Cookie,服务器端从客户端获取
        Cookie[] cookies = req.getCookies();//这里返回数组,说明Cookie可能存在多个
        //判断Cookies是否存在
        if(cookies!=null){
     
            //如果存在怎么办
            out.write("你上一次访问的时间是:");
            for (int i = 0; i <cookies.length ; i++) {
     
                Cookie cookie = cookies[i];
                //获取cookie的名字
                if(cookie.getName().equals("lastLoginTime")){
     
                    //获取cookie中的值
                    long lastLoginTime = Long.parseLong(cookie.getValue());//解析成长整型 变成时间戳
                    Date date = new Date(lastLoginTime);
                    out.write(date.toLocaleString());
                }
            }
        }else{
     
            out.write("这是您第一次访问本站");
        }
        //服务端给客户端响应一个cookie
        Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
        //cookie有效期为1天
        cookie.setMaxAge(24*60*60);
        resp.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     
        doGet(req, resp);
    }
}

7.4 Session(重点)

20210123 javaWeb之Cookie Session 详解第三部分_第2张图片

什么是Session:

  • 服务器会给每个用户浏览器创建一个Session对象;

  • 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在;

  • 用户登录之后,整个网站它都可以访问
    20210123 javaWeb之Cookie Session 详解第三部分_第3张图片
    Session和Cookie的区别:

  • Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)

  • Session把用户的数据写到用户独占Session 中,服务器端保存(保存重要信息,减少服务器资源的浪费)

  • Session对象由服务端创建

使用场景

  • 保存一个登录用户的信息;
  • 购物车信息;
  • 在整个网站中经常会使用的数据,我们将它保存在Session中;

使用Session

public class SessionServlet extends HttpServlet {
     
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     
        //解决乱码问题
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");
        //得到session
        HttpSession session = req.getSession();
        //给session存(对象、字符串)东西
        session.setAttribute("name","gdh");
        //获取session存的东西
        session.getAttribute("name");
        //获取session的ID
        String sessionid = session.getId();
        //判断Session是不是新创建
        if(session.isNew()){
     
            resp.getWriter().write("session创建成功,ID:"+sessionid);
        }else{
     
            resp.getWriter().write("session已经在服务器中存在了,ID:"+sessionid);
        }
        //移除这个session
        session.removeAttribute("name");
        //手动注销session
        session.invalidate();

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     
        doGet(req, resp);
    }
}

会话自动过期:web.xml中配置


<session-config>
    
    <session-timeout>15session-timeout>
session-config>

你可能感兴趣的:(基础篇,java)