您好,登錄后才能下訂單哦!
今天小編給大家分享一下Java Web開發(fā)中怎么自定義Session的相關知識點,內(nèi)容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
Session在存儲安全性要求較高的會話信息方面是必不可少的,對于分布式Web應用自定義Session支持獨立的狀態(tài)服務器或集群是必須的。
ASP.NET通過SessionStateModule通過配置文件配置實際的Session提供程序,Session提供程序?qū)崿F(xiàn)了SessionStateStoreProviderBase,因此在ASP.NET中實現(xiàn)自定義Session是通過繼承SessionStateStoreProviderBase實現(xiàn),配置Session是通過Web.config。ASP.NET自定義session的代碼參考github上的開源項目SQLiteSessionStateStore。
同理,Java Servlet中使用自定義Session通過Filter可以實現(xiàn)。由于不同的servlet容器對Session的實現(xiàn)不同,所以通用性最好的方式是繼承HttpServletRequestWrapper重寫getSession方法返回自定義的Session對象。Filter采用了職責鏈模式(chain of responsibility),HttpServletRequestWrapper采用了裝飾模式(Decorator),可以通過《Head First 設計模式》閱讀模式的相關內(nèi)容。
1.首先自定義繼承HttpSession的MySession(為了便于演示,僅包裝了容器的session并轉發(fā)調(diào)用)。
import java.util.Enumeration; import javax.servlet.ServletContext; import javax.servlet.http.HttpSession; public class MySession implements HttpSession { private HttpSession _containerSession; public MySession(HttpSession session) { this._containerSession = session; } @Override public long getCreationTime() { return this._containerSession.getCreationTime(); } @Override public String getId() { return this._containerSession.getId(); } @Override public long getLastAccessedTime() { return this._containerSession.getLastAccessedTime(); } @Override public ServletContext getServletContext() { return this._containerSession.getServletContext(); } @Override public void setMaxInactiveInterval(int interval) { this._containerSession.setMaxInactiveInterval(interval); } @Override public int getMaxInactiveInterval() { return this._containerSession.getMaxInactiveInterval(); } @SuppressWarnings("deprecation") @Override public HttpSessionContext getSessionContext() { return this._containerSession.getSessionContext(); } @Override public Object getAttribute(String name) { return this._containerSession.getAttribute(name); } @SuppressWarnings("deprecation") @Override public Object getValue(String name) { return this._containerSession.getValue(name); } @Override public EnumerationgetAttributeNames() { return this._containerSession.getAttributeNames(); } @SuppressWarnings("deprecation") @Override public String[] getValueNames() { return this._containerSession.getValueNames(); } @Override public void setAttribute(String name, Object value) { this._containerSession.setAttribute(name, value); } @SuppressWarnings("deprecation") @Override public void putValue(String name, Object value) { this._containerSession.putValue(name, value); } @Override public void removeAttribute(String name) { this._containerSession.removeAttribute(name); } @SuppressWarnings("deprecation") @Override public void removeValue(String name) { this._containerSession.removeValue(name); } @Override public void invalidate() { this._containerSession.invalidate(); } @Override public boolean isNew() { return this._containerSession.isNew(); } }
2.自定義繼承HttpServletRequestWrapper的MyRequest
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpSession; public class MyRequest extends HttpServletRequestWrapper { public MyRequest() { super(null); } public MyRequest(HttpServletRequest request) { super(request); // TODO 自動生成的構造函數(shù)存根 } @Override public HttpSession getSession(boolean create) { return new MySession(super.getSession(create)); } @Override public HttpSession getSession() { return new MySession(super.getSession()); } }
3.自定義Filter將Request包裝為MyRequest
import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; @WebFilter("/*") public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // TODO 自動生成的方法存根 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { chain.doFilter(new MyRequest((HttpServletRequest) request), response); } @Override public void destroy() { // TODO 自動生成的方法存根 } }
通過注解配置了Filter,也可以通過原始的web.xml方式配置。
以上就是“Java Web開發(fā)中怎么自定義Session”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。