浅谈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,关闭浏览器失效,默认
设置永不过期