package org.nutz.mvc.impl.session; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.nutz.mvc.SessionProvider; /** * 抽象的SessionProvider实现,可以作为 * * @author wendal * */ public abstract class AbstractSessionProvider implements SessionProvider { private static final Object lock = new Object(); public HttpServletRequest filter(final HttpServletRequest req, final HttpServletResponse resp, final ServletContext servletContext) { return new SessionProviderHttpServletRequestWrapper(req, resp, servletContext); } /** * 子类覆盖此方法,以创建一个新的Session对象,或者任何你想做的事 */ public abstract HttpSession createSession(final HttpServletRequest req, final HttpServletResponse resp, final ServletContext servletContext); public abstract HttpSession getExistSession(final HttpServletRequest req, final HttpServletResponse resp, final ServletContext servletContext); public void notifyStop() {} public class SessionProviderHttpServletRequestWrapper extends HttpServletRequestWrapper { protected HttpSession session; protected HttpServletRequest req; protected HttpServletResponse resp; protected ServletContext servletContext; public SessionProviderHttpServletRequestWrapper(HttpServletRequest req, HttpServletResponse resp, ServletContext servletContext) { super(req); this.req = req; this.resp = resp; this.servletContext = servletContext; this.session = getExistSession(req, resp, servletContext); } public HttpSession getSession(boolean create) { if (create && session == null) { synchronized (lock) {// 因为创建Session并不需要太多并发 if (session == null) session = createSession(req, resp, servletContext); } } return session; } public HttpSession getSession() { return getSession(true); } } }