Java Web开发中怎么自定义Session

蜗牛 互联网技术资讯 2022-09-29 123 0

今天小编给大家分享一下Java Web开发中怎么自定义Session的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

Session在存储安全性要求较高的会话信息方面是必不可少的,对于分布式Web应用自定义Session支持独立的状态服务器或集群是必须的。

ASP.NET通过SessionStateModule通过配置文件配置实际的Session提供程序,Session提供程序实现了SessionStateStoreProviderBase,因此在ASP.NET中实现自定义Session是通过继承SessionStateStoreProviderBase实现,配置Session是通过Web.config。ASP.NET自定义session的代码参考github上的开源项目SQLiteSessionStateStore。

Java Web开发中怎么自定义Session  java 第1张

同理,Java Servlet中使用自定义Session通过Filter可以实现。由于不同的servlet容器对Session的实现不同,所以通用性最好的方式是继承HttpServletRequestWrapper重写getSession方法返回自定义的Session对象。Filter采用了职责链模式(chain of responsibility),HttpServletRequestWrapper采用了装饰模式(Decorator),可以通过《Head First 设计模式》阅读模式的相关内容。

1.首先自定义继承HttpSession的MySession(为了便于演示,仅包装了容器的session并转发调用)。

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 自动生成的构造函数存根
}
@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开发中怎么自定义Session”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注蜗牛博客行业资讯频道。

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

评论

有免费节点资源,我们会通知你!加入纸飞机订阅群

×
天气预报查看日历分享网页手机扫码留言评论Telegram