package me.test.redis; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpSession; import me.test.MySessionFilter; import me.test.SessionManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class MyRequest extends HttpServletRequestWrapper { private Logger logger = LoggerFactory.getLogger(MyRequest.class); private SessionManager sessionManager; private HttpSession session; private String requestedSessionId; private boolean requestedSessionIdFromCookie = false; public MyRequest(SessionManager sessionManager) { super(MySessionFilter.requestHolder.get()); this.sessionManager = sessionManager; // 从request中获取 sessionID readRequestedSessionId(); } private void readRequestedSessionId() { readRequestedSessionIdFromCookie(); if (requestedSessionId == null || session == null) { readRequestedSessionIdFromURL(); } if (session != null) { sessionManager.accessSession(session); } } private void readRequestedSessionIdFromCookie() { Cookie[] cookies = getCookies(); if (cookies != null && cookies.length > 0) { for (int i = 0; i < cookies.length; i++) { if (sessionManager.getSessionIdCookieName().equalsIgnoreCase(cookies[i].getName())) { requestedSessionId = cookies[i].getValue(); requestedSessionIdFromCookie = true; logger.debug("Got Session ID {} from cookie", requestedSessionId); if (requestedSessionId != null) { if (sessionManager.isSessionValid(requestedSessionId)) { session = sessionManager.getHttpSession(requestedSessionId); break; } } else { logger.warn("null session id from cookie"); } } } } } private void readRequestedSessionIdFromURL() { String uri = getRequestURI(); String paramName = sessionManager.getSessionIdUrlMatrixParamName(); if (paramName != null) { String prefix = ";" + paramName + "="; int s = uri.indexOf(prefix); if (s >= 0) { s += prefix.length(); int i = s; while (i < uri.length()) { char c = uri.charAt(i); if (c == ';' || c == '#' || c == '?' || c == '/') break; i++; } requestedSessionId = uri.substring(s, i); requestedSessionIdFromCookie = false; if (sessionManager.isSessionValid(requestedSessionId)) { session = sessionManager.getHttpSession(requestedSessionId); } else { session = null; } logger.debug("Got Session ID {} from URL", requestedSessionId); } } } public String getRequestedSessionId() { return requestedSessionId; } public HttpSession getSession(boolean create) { // 可用HttpSession对象是否已经创建了? if (session != null) { if (sessionManager.isSessionValid(session.getId())) { return session; } else { session = null; } } if (!create) { return null; } session = sessionManager.newHttpSession(); return session; } public HttpSession getSession() { return getSession(true); } public boolean isRequestedSessionIdValid() { return sessionManager.isSessionValid(this.getRequestedSessionId()); } public boolean isRequestedSessionIdFromCookie() { return requestedSessionId != null && requestedSessionIdFromCookie; } public boolean isRequestedSessionIdFromURL() { return requestedSessionId != null && !requestedSessionIdFromCookie; } public boolean isRequestedSessionIdFromUrl() { return isRequestedSessionIdFromURL(); } }