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;
    }

}

使用

首次请求则创建

得到

 

posted on 2018-08-16 20:26  东子z  阅读(134)  评论(0编辑  收藏  举报

导航