zoukankan      html  css  js  c++  java
  • 浅谈cookie与session

    学校web作业做的不少,对cookie与session也用了蛮多,在此小计一些干货

    由于HTTP协议是无状态的,连接建立成功后便释放了,那么如何知道xxx,yyy操作都属于zzz呢? cookie与session就是用来解决这个问题

    SESSION与COOKIE的一些重要知识点:
    cookie与session都是会话技术

    session存储在服务器端(默认存在文件里不是内存),cookie存储在客户端(浏览器)有一定的安全隐患

    session的运行依赖sessionID,第一次创建session时候,服务器端会自动在cookie中添加该session对象的JSESSIONID=ID.

    session可以放在文件里、内存里、数据库里

    浏览器端禁用了cookie,同理session也会失效因为sessionID传不过去了,可以通过URL重传,在其后面加上sessionID,如果页面多连接多,会增加不必要的工作量,那可以强制让你用户开启接收Cookie后再让其访问即可。

    用户登录用cookie还是用session存储的一些思考
    思路一:用户登录成功,视需求在服务器端存储必要信息至cookie中如账号、姓名、年龄给前台。
      场景:
      访问受限资源时前台需要判断用户是否登陆:看js能不能获取到指定cookie信息。
      服务器端若需判断用户是否登录:看服务器端能不能获取到用户的相关cookie信息。
      缺陷:cookie欺骗容易造成安全隐患。
    思路二:用户登陆成功,持久层查找到该用户并用session将用户信息都存储起来,只给前台一个SESSIONID。并返回用户一些json数据。
      场景:
      前台需要判断用户是否登录:发送请求至服务器端看session里用户是否为空,服务器端返回结果。
      服务器端判断用户是否登陆:看session里面用户是否为空。
      虽说提高了安全性,但对服务器访问次数增加了啊.每一次看受限制界面都要去服务器端请求一次看是否登陆了

    cookie基本用法:
    前端使用cookie

      【jquery方式】:https://www.cnblogs.com/webcome/p/5470975.html

      【js方式】:https://blog.csdn.net/zaynahly/article/details/75514988

    java使用cookie:

      java使用cookie要注意中文乱码问题,cookie默认存储的是ASCII字符在内存中占2个字节,中文属于UNICODE字符在内存中占4个字节。要进行解码操作,使用java.net.URLEncoder类。session的话不需要考虑中文乱码问题

       private final static String URL_CODE = "UTF-8";
    
        //添加cookie
        public static void addCookie(HttpServletResponse resp, String key, String value) {
            try {
                Cookie cookie = new Cookie(key, URLEncoder.encode(value, URL_CODE));
                cookie.setPath("/");
                resp.addCookie(cookie);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        
        //获取指定cookie
        private static String getCookie(HttpServletRequest req, String key) {
            Cookie[] cookies = req.getCookies();
            if (cookies != null) {
                try {
                    for (Cookie cookie : cookies) {
                        if (cookie.getName().equals(key)) {
                            return URLDecoder.decode(cookie.getValue(), URL_CODE);
                        }
                    }
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            }
            return "-1";
        }
        
        //清空cookie
        public static void clearCookie(HttpServletRequest req, HttpServletResponse resp) {
            Cookie[] cookies = req.getCookies();
            if (cookies != null) {
                for (Cookie cookie : cookies) {
                    cookie.setMaxAge(0);
                    cookie.setPath("/");
                    resp.addCookie(cookie);
                }
            }
        }

    注意点:

    cookie中文乱码问题

    cookie不设置过期时间的话则默认是浏览器关闭cookie就失效了

       cookie.setMaxAge(Integer.MAX_VALUE);//设置永不过期
    cookie.setMaxAge(
    0);//不记录cookie cookie.setMaxAge(-1);//会话级cookie,关闭浏览器失效,默认
    设置永不过期
  • 相关阅读:
    谷歌推开发者培训指南 欲提升Android软件质量
    装饰者模式【java版】
    Java GetBytes 编码方式
    为什么程序员都是夜猫子
    Android的Handler总结
    常见的自然法则及管理启示
    java常用设计模式
    Android optionsmenu例程
    关于程序员成长的一点思考
    Java 字节流读写文件
  • 原文地址:https://www.cnblogs.com/zengcongcong/p/12160990.html
Copyright © 2011-2022 走看看