session和cookie的作用有点类似,都是为了存储用户相关的信息。不同的是,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; } }
使用
首次请求则创建
得到