溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java Web開發(fā)中怎么自定義Session

發(fā)布時間:2022-09-28 16:11:10 來源:億速云 閱讀:136 作者:iii 欄目:web開發(fā)

今天小編給大家分享一下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 Web開發(fā)中怎么自定義Session

同理,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è)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI