zoukankan      html  css  js  c++  java
  • cookie和session的的区别以及使用示例?

    本篇文章并非本人所创,实质借鉴于一篇知乎文章,内容写的很是生动有趣,通俗易懂,以此来作为笔记时刻翻看回味。

    这俩货平时非常低调,不是很出挑。Session相对来说稍微会好一些,Java程序猿们日常多少会接触点,用Session域存取对象啥的。但这个Cookie,估计大部分Java程序猿,平时不要说用到,连这个单词都很少敲。而且Cookie说起来吧,位置有点特殊。前端的人觉得它和后端沾亲带故,后端的人觉得这玩意就是前端搞的,关我屁事。如此一来,谁都没把它当回事儿。

    1.cookie和session的的区别?

    • 简而言之上的区别:
    性质 cookie session
    不同点 默认存储在客户端浏览器内存,浏览器关闭,会话结束 默认存在服务端,session失效,会话结束
    安全性 不安全,别人可以查看你的电脑窃取你浏览器中的用户名和密码明文,所以现在登录也有使用手机短信验证码登录的 相对来说比较安全
    相同点 用来跟踪浏览器用户身份的会话方式 用来跟踪浏览器用户身份的会话方式

    2. Cookie的代码示例

    服务器端如何将Cookie发给浏览器呢?

    点击查看代码
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * @author ying
     * @version 1.1
     * @className SendCookieServlet
     * @description TODO
     * @date 2021/11/20 11:13
     **/
    public class SendCookieServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        @Override
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //1、创建cookie对象
            Cookie cookie1 = new Cookie("name", "bravol988");
            Cookie cookie2 = new Cookie("time", "6pm");
            Cookie cookie3 = new Cookie("table", "69");
            //2、把cookie发送给客户端
            response.addCookie(cookie1);
            response.addCookie(cookie2);
            response.addCookie(cookie3);
        }
    
        @Override
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }
    

    因为现在客户端已经有Cookie了,所以往后每次访问该服务器,都会带上这个Cookie。那么,如何在服务器端得到客户端带来的Cookie呢?

    点击查看代码
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * @author ying
     * @version 1.1
     * @className GetCookieServlet
     * @description TODO
     * @date 2021/11/20 11:25
     **/
    public class GetCookieServlet extends HttpServlet {
        
        private static final long serialVersionUID = 1L;
    
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //1.从浏览器HTTP请求中获取Cookie
            //获得客户端携带的cookie的数据
            Cookie[] cookies = request.getCookies();
            //通过cookie名称获得想要的cookie
            if (cookies != null) {
                for (Cookie cookie : cookies) {
                    //获得cookie的名称
                    String cookieName = cookie.getName();
                    // 打印名为name、time、table的cookie值
                    if (cookieName.equals("name") || cookieName.equals("time")
                            || cookieName.equals("table")) {
                        String cookieValue = cookie.getValue();
                        // 2.打印Cookie值
                        System.out.println(cookieValue);
                    }
                }
            }
    
        }
    }
    
    

    上面代码中,服务器向浏览器响应的Cookie就是会话Cookie。会话Cookie被保存在浏览器的内存中,当浏览器关闭时,内存被释放,内存中的Cookie自然也就烟消云散。

    这样太麻烦了,关闭浏览器引发Cookie消失,下次还要重新登录。能不能向客户端响应持久性Cookie呢?答案是可以的,只要设置Cookie的持久化时间即可!

    点击查看代码
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * @author ying
     * @version 1.1
     * @className SendCookieServlet
     * @description TODO
     * @date 2021/11/20 11:13
     **/
    public class SendCookieServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        @Override
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //1、创建cookie对象
            Cookie cookie = new Cookie("name", "bravol988");
            //2、为cookie设置持久化时间,10分钟(cookie信息在硬盘上保存的时间)
            cookie.setMaxAge(10 * 60);
            //3、把cookie发送给客户端
            response.addCookie(cookie);
        }
    
        @Override
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }
    

    小结:

    • 不设置MaxAge,默认响应会话Cookie(MaxAge<0),存在浏览器内存。Cookie随浏览器关闭而消失
    • 设置MaxAge>0,响应持久性Cookie,会存在电脑硬盘的特定文件夹下(浏览器自定义的)
    • 设置特定Cookie的MaxAge=0,则会删除已经存在客户端的此Cookie

    3. Session的代码示例

    相比较Cookie存在客户端,Session则是服务端的东西。其本质上类似于一个大Map,里面的内容,以键值对的形式存储。

    这回,我们不再把"name=brava1988;time=6pm;table=69"这样的数据作为Cookie放在请求头/响应头里传来传去了,而是只给客户端传一个JSESSIONID(其实也是一个Cookie)!此时,真正的数据存在服务器端的Session中,Cookie中只是存了Session的id,即JSESSIONID。下次访问该网站时,把JSESSIONID带上,即可在服务器端找到对应的Session,也相当于“带去”了用户信息。

    点击查看代码
    import javax.servlet.ServletException;
    import javax.servlet.http.*;
    import java.io.IOException;
    
    /**
     * @author ying
     * @version 1.1
     * @className SessionServlet1
     * @description TODO
     * @date 2021/11/20 11:48
     **/
    public class SessionServlet1 extends HttpServlet {
        private static final long serialVersionUID =1L;
    
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //创建属于该客户端(会话)的私有的session区域
            /* request.  getsession ()方法内部会判断该客户端是否在服务器端已经存在session
             * 如果该客户端在此服务器不存在session
             * 那么就会创建一个新的session对象如果该客户端在此服务器已经存在session获得已经存在的该session返回
             */
            HttpSession session = request.getSession();
            session.setAttribute("name", "bravol988");
            session.setAttribute("time", "6pm");
            session.setAttribute("table", "69");
            String id = session.getId();//该session对象的编号id
            //手动创建一个存储 JsEssIoNID 的cookie为该cookie设置持久化时间
            Cookie cookie = new Cookie(" JSESSIONID ", id);
            cookie.setMaxAge(60 * 10);
            //Cookie只保存 JSESSIONID ,不保存敏感信息
            response.addCookie(cookie);
            response.getWriter().write(" JSESSIONID :" + id);
        }
    }
    
    现在,我请大家重新仔细看一下上面设置JSESSIONID到Cookie的代码。 其实,只要你在服务器端创建了Session,即使不写addCookie("JSESSIONID", id),JSESSIONID仍会被作为Cookie返回。
    点击查看代码
    import javax.servlet.ServletException;
    import javax.servlet.http.*;
    import java.io.IOException;
    
    /**
     * @author ying
     * @version 1.1
     * @className SessionServlet1
     * @description TODO
     * @date 2021/11/20 11:48
     **/
    public class SessionServlet1 extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //创建属于该客户端(会话)的私有的session区域
            /*request. get8ession ()方法内部会判断该客户端是否在服务器端已经存在session
             * 如果该客户端在此服务器不存在session那么就会创建一个新的session对象
             * 如果该客户端在此服务器已经存在session获得已经存在的该session返回
             */
            HttpSession session1 = request.getSession();
            HttpSession session2 = request.getSession();
    
            String id1 = session1.getId();//该session对象的编号id
            String id2 = session2.getId();//该session对象的编号id
            System.out.println(" JSESSIONID :" + id1);
            System.out.println(" JSESSIONID :" + id2);
        }
    }
    
  • 相关阅读:
    phpcms基础
    读取数据库有的设置选中状态
    用php 生成 excel 表格
    ajax验证用户名是否存在,手机号是不是匹配
    系统登陆简单的密码验证
    分页显视
    时间选择的三级连动 年,月,日
    session控制登入权限
    jQuery, js 验证两次输了密码的一相同
    正则表达式判断手机号是否11位数字
  • 原文地址:https://www.cnblogs.com/ringbug/p/15580719.html
Copyright © 2011-2022 走看看