• Session


    sessioncookie的作用有点类似,都是为了存储用户相关的信息。不同的是,cookie是存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,但现在服务器已经发展至今,一些session信息还是绰绰有余的。

    自定义Session

    首先定义接口

    1 package com.dz.session;
    2 
    3 public interface MySession {
    4     String id();
    5     Object get(String key);
    6     void set(String key,Object value);
    7 }

    话不多说继续代码(实现该接口)

    package com.dz.service;
    
    import com.dz.session.MySession;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class MemorySession implements MySession{
        private Map<String,Object> map=new HashMap<>();
        private String id;
    
        public MemorySession() {
        }
    
        public MemorySession(String id) {
            this.id = id;
        }
    
        @Override
        public String id() {
            return this.id;
        }
    
        @Override
        public Object get(String key) {
            return map.get(key);
        }
    
        @Override
        public void set(String key, Object value) {
            map.put(key,value);
        }
    }

    完成所有Session方法

    到Cookie

    package com.dz.service;
    
    import com.dz.session.MySession;
    
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.UUID;
    
    public class SessionFactory {
        //为每一个连接提供一个ID
        private final static String SESSION_SID="MY_ID";
        //静态成员会一直存在
        private static Map<String,MySession> data=new HashMap<>();
        public static MySession getSession(HttpServletRequest req, HttpServletResponse resp){
            String sid=null;
            MySession session=null;
            //查找Cookie是否存在,如果存在则得到ID值
            Cookie[] cookies = req.getCookies();
            for (Cookie cookie : cookies) {
                if(cookie.getName().equals(SESSION_SID)){
                   sid=cookie.getValue();
                    break;
                }
            }
            // 如果 cookie 中获取不到合适的 Session Id,说明当前请求是第一次访问
            // 这时就需要为其初始化 session 对象
            if(!checkedSid(sid)){
                // 生成随机且唯一的 session id
                sid=getUUID();
                // 创建新的 session 对象
               session= createNexSession(sid);
               //添加一个新的Cookie
                // 那么浏览器在下次请求的时候,会自动将这些 cookie 信息发送到服务器
                resp.addCookie(new Cookie(SESSION_SID,sid));
            }else{
                //如果能从cookie能获得合适的session id
                //那么就尝试在data里面  获得这个请求对应的 session
                session=data.get(sid);
                // 如果拿到的是空,说明不存在,就需要重新创建
                if(session == null) {
                    session = createNexSession(sid);
                }
            }
            // 将获取或者新创建的 session 返回,任务完成
            return session;
        }
        /**
         * 检查 sid 格式是否正确
         */
        private static boolean checkedSid(String sid){
            return !(sid==null || sid.isEmpty());
        }
        /**
         * 生成随机的唯一字符串,作为 session id 使用
         */
        private static String getUUID(){
            return String.valueOf(UUID.randomUUID());
        }
        /**
         * 创建新的 session,并将其保存到 sessions 里面
         */
        private static MySession createNexSession(String sid){
            MySession memorySession = new MemorySession(sid);
            data.put(sid,memorySession);
            return memorySession;
        }
    
    }

    使用

    首次请求则创建

    得到

    不忘初心
  • 相关阅读:
    2020软件工程作业04
    2020软件工程作业02
    第一周作业
    2019春总结作业
    12周作业
    第十一周作业
    第十周阅读
    第9周编程总结
    编程总结模版
    第8周编程总结
  • 原文地址:https://www.cnblogs.com/dzcici/p/9489629.html
Copyright © 2020-2023  润新知