专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 在Java Web开发中自定义Session

在Java Web开发中自定义Session

更新时间:2020-10-22 17:59:41 来源:动力节点 浏览1342次

Session在存储安全性要求较高的会话信息方面是必不可少的,对于分布式Web应用自定义Session支持独立的状态服务器或集群是必须的。本文就来教大家如何在Java Web开发中自定义Session

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

image.png


同理,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方式配置。

随着人们网络安全的提高,session机制开始在Java Web前端开发的服务端和客户端的交互模式中得到广泛运用。在本站的Java Web教程中,会对Session和Cookie机制进行超详细的解读,让你对前端开发的最新前沿技术了如指掌!


提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>