6 Cookies 和Session

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了6 Cookies 和Session相关的知识,希望对你有一定的参考价值。

1.HTTP协议无状态带来的问题

   http协议在一个会话中的多个请求之间是不能共享数据的
   (实际是需要在一个会话的多个请求共享数据)
   会话跟踪技术:在一个会话共享数据

2.解决一个会话中多个请求之间共享数据的三种方式

   ①.使用GET方式,将需要共享的数据以参数的形式传递给下一个页面即可
     使用GET方式共享数据,所有数据都暴露在地址栏中,不安全
     ②使用cookie技术
     将需要共享的数据封装到浏览器的请求头中
         ③使用session技术

3.Cookie

    客户端技术,将需要共享的数据存放在浏览器中,每次请求时,对应需要共享数据的
    页面只需在浏览器获取需要的数据即可。
      ①创建Cookie对象共享数据
        Cookie cookie=new Cookie(String name,String value);
      ②将cookie响应给浏览器
         resp.addCookie(cookie);
       ③从请求对象获取所有的cookie
        Cookie[] cookies=req.getCookies();
    for(Cookie cookie:cookies){
       if("currentName".equals(cookie.getName())){
         String username=cookie.getValue();
       }
    }
   4.cookie中文问题的解决方案,先编码后解码

      编码:
     Cookie cookie=new Cookie("currentName",URLEncoder.encode(username,"utf-8"));
  解码:
     username=URLDecoder.decode(cookie.getValue(),"utf-8");

Cookie的缺陷:
    Cookie不能存储中文字符
Cookie一次只能存储单个字符串,不能存储对象
cookie大小限制在4kb内
cookie数据是存储在浏览器中的,浏览器把Cookie数据删除了,那么共享数据就找不回来了

     不同Cookie下面的路径是不同的,路径不同的Cookie之间是不能共享数据的
 解决方案: 将Cookie路径设置项目的根路径  
         cookie.setPath(“/”)
 @WebServlet("/cookie/login")
 public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.setCharacterEncoding("utf-8");
    resp.setContentType("text/html;charset=utf-8");

    //接受请求参数
    String username = req.getParameter("username");
    //================================================
    //创建Cookie对象,并且共享数据 (相当办卡的操作)
    Cookie cookie = new Cookie("currentName", URLEncoder.encode(username,"utf-8"));
    //设置Cookie的时长 单位 秒
    //cookie.setMaxAge(10);
    //删除Cookie 
    //cookie.setMaxAge(0);
    //设置Cookie的路径为根路径
    cookie.setPath("/");
    //将Cookie数据响应给浏览器 (相当于将办理好的会员卡给用户)
    resp.addCookie(cookie);
    //创建新的Cookie ,覆盖之前的cookie (相当于修改了cookie)

// Cookie cookie1 = new Cookie("currentName", "jinken");
// resp.addCookie(cookie1);

    //================================================

    PrintWriter out = resp.getWriter();
    out.print("欢迎 : "+username+" <br>");
    out.print("<a href=‘/ooxx/list‘>收件箱(500)</a>");
}

}

 @WebServlet("/ooxx/list")
public class ListServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;

@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.setCharacterEncoding("utf-8");
    resp.setContentType("text/html;charset=utf-8");

    // =============================================
    String username = null;
    // 从请求对象中获取所有的cookie
    Cookie[] cookies = req.getCookies();
    for (Cookie cookie : cookies) {
        if("currentName".equals(cookie.getName())){
            username = URLDecoder.decode(cookie.getValue(), "utf-8");
            break;
        }
    }

    // =============================================

    PrintWriter out = resp.getWriter();
    out.print("欢迎 :"+username+" <br>");
    for (int i = 0; i < 5; i++) {
        out.print("<a href=‘/cookie/content‘>邮件 (" + i + ")</a><br/>");
    }
}

}

@WebServlet("/cookie/content")
public class ContentServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.setCharacterEncoding("utf-8");
    resp.setContentType("text/html;charset=utf-8");
    String username = null;
    // =============================================
    Cookie[] cookies = req.getCookies();
    for (Cookie cookie : cookies) {
        if("currentName".equals(cookie.getName())){
            username = URLDecoder.decode(cookie.getValue(), "utf-8");
        }
    }
    // =============================================
    PrintWriter out = resp.getWriter();
    out.print("欢迎 : "+username+" <br>");
    out.print("班长, 你最近好吗?");

}

}

jsp中书写Cookies
<%   
    Cookie cookie = new Cookie(   
            URLEncoder.encode("姓名","UTF-8"),   
            URLEncoder.encode("李佳龙","UTF-8")   
    );   
    response.addCookie(cookie);   
%>   
<html>   
<title>Cookie-中文</title>   
<body>   
<%   
    if(request.getCookies()!=null)   
    {   
        for(Cookie coo : request.getCookies())   
        {   
            String name =URLDecoder.decode(coo.getName(),"UTF-8");   
            String value = URLDecoder.decode(coo.getValue(),"UTF-8");   
            out.println(name "-- " value);   
        }   
    }   
%>    
el表达式:

${cookie}<!-- 显示所有Cookie对象 -->   
${cookie.age.name }<!-- 显示Cookie名为age的name -->   
${cookie.age.value }<!-- 显示Cookie名为age的值 -->  
4.Session
       Session是服务器端技术(把识别数据/共享数据存放在服务端)
       为每一个用户的浏览器创建独立的session,可以把数据存放在各自的session中,
       取数据也从各自session取
       (session是一个特殊的cookie,session得底层依然是cookie技术,cookie是内存地址
          JSESSIONID)
       1.获取Session对象
          HttpSession session=request.getSession();
      如果内存中有session对象,返回,没有则创建一个并返回
       2.共享数据
            setAttribute("USER_IN_SESSION",user);
       3.获取共享数据
           getAttribute("USER_IN_SESSION");

   当cookie被禁用后,URL重写问题
         浏览器禁用cookie后,就再也不能接收服务器响应的cookie,此时cookie和session
     就不能共享数据,直接访问URL地址是不能获取共享数据的
        使用URL重写
        resp.encodeURL(String url);
        如果浏览器禁用cookie,url会自动加上jsessionid,如果没有禁用,就不会
        加上jsessionid

@WebServlet("/session/login")
public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        //接受请求参数
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        User user = new User();
        user.setUsername(username);
        user.setPassword(password);

        //================================================
        //1.获取Sesion对象
        HttpSession session = req.getSession();
        //2.将数据共享的Session对象中
        //session.setAttribute("USERNAME_IN_SESSION", username);
        session.setAttribute("USER_IN_SESSION", user);
        //3.修改共享数据
        //session.setAttribute("USERNAME_IN_SESSION", "虚竹");
        //4.删除session中共享的数据
        //session.removeAttribute("USERNAME_IN_SESSION");
        //5.清空Sesion对象中所有数据
        //session.invalidate();
        //6.设置当前Session10秒钟超时
        //session.setMaxInactiveInterval(10);
        //获取Session的id
        String sessionId = session.getId();
        System.out.println(sessionId);
        //================================================
        //使用url重写
        //String newUrl = resp.encodeURL(String oldUrl);
        // 如果浏览器禁用了 Cookie,newUrl后面会自动加上 jsessionid,如果没有禁用,就不会加上jsession
        PrintWriter out = resp.getWriter();
        out.print("欢迎 : "+username+" <br>");
//      out.print("<a href=‘/session/list;jsessionid="+session.getId()+"‘>收件箱(500)</a>");
        out.print("<a href=‘"+resp.encodeURL("/session/list")+"‘>收件箱(500)</a>");
    }

}

@WebServlet("/session/list")
public class ListServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        // =============================================
        //获取Session对象
        HttpSession session = req.getSession();
        //获取sesion共享的数据
        User user = (User)session.getAttribute("USER_IN_SESSION");
        System.out.println(user);
        // =============================================

        PrintWriter out = resp.getWriter();
        out.print("欢迎 :"+user.getUsername()+" <br>");
        for (int i = 0; i < 5; i++) {
            //out.print("<a href=‘/session/content;jsessionid="+session.getId()+"‘>邮件 (" + i + ")</a><br/>");
            out.print("<a href=‘"+resp.encodeURL("/session/content")+"‘>邮件 (" + i + ")</a><br/>");
        }
    }

}
@WebServlet("/session/content")
public class ContentServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.setCharacterEncoding("utf-8");
    resp.setContentType("text/html;charset=utf-8");
    // =============================================
    // 获取Session对象
    HttpSession session = req.getSession();
    // 获取sesion共享的数据
    User user = (User) session.getAttribute("USER_IN_SESSION");
    // =============================================
    PrintWriter out = resp.getWriter();
    out.print("欢迎 : " + user.getUsername() + " <br>");
    out.print("班长, 你最近好吗?");

}

}

以上是关于6 Cookies 和Session的主要内容,如果未能解决你的问题,请参考以下文章

关于Cookies和Session的有效时间分析

session和cookies

django--cookies 和 session

大家说说session和cookies那个安全性高一点?

Cookies和Session的区别和理解

简述cookies和session的区别