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

Web开发中自定义Session。

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

同理,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机制进行超详细的解读,让你对前端开发的最新前沿技术了如指掌!

java sessionstate_在Java Web开发中自定义Session相关推荐

  1. java css路径_java web开发中CSS路径有问题吗,运行jsp文件为什么找不到css文件?...

    ---------------------------------------------------------------------------------------------------- ...

  2. java中文乱码decode_Java WEB开发中的中文乱码问题解决

    在项目中总是遇到乱码问题,有时候在网上查找到了解决方案,但是没有记录下来为什么出现的乱码.因为出现乱码的方式有好几种,我简单总结一下吧,为以后留着用,也算总结学习一下. 一般来讲,为了处理乱码问题,在 ...

  3. java web框架struts_Struts框架在Web开发中的应用

    <Struts框架在Web开发中的应用>由会员分享,可在线阅读,更多相关<Struts框架在Web开发中的应用(29页珍藏版)>请在人人文库网上搜索. 1.Struts,框架在 ...

  4. java web开发中Filter使用Annotation配置 (转载)

    为什么80%的码农都做不了架构师?>>>    为了在java中得到request和response对象,搜索到了 <如何在Java的普通类中获取Session以及reques ...

  5. Java Web开发中路径问题小结

    Java Web开发中,路径问题是个挺麻烦的问题,本文小结了几个常见的路径问题,希望能对各位读者有所帮助. (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 ...

  6. java和Mysql数据一致性_java web开发中数据一致性的问题

    在java web开发中,数据存储介质有如下几种数据库(rdms,nosql) 缓存系统(redis,memcached,ehcache) java内部数据结构(map,list) 文件存储(fast ...

  7. java开发 图片显示不出来_java web开发中 显示图片的问题

    记录一个java Web开发中显示图片的小问题: 我碰到的问题是:把服务器上存的图片,在客户端的浏览器中显示出来.解决方法如下: 两种显示方式 一是:在servlet 或 action中直接输入图片到 ...

  8. java 写一个商店_Java Web开发之基于Session的购物商店实现方法

    本文实例讲述了Java Web开发之基于Session的购物商店实现方法.分享给大家供大家参考,具体如下: package cn.com.shopping; import java.io.IOExce ...

  9. .NET、JAVA和PHP在Web开发的优缺点

    .NET.JAVA和PHP在Web开发的优缺点 现在做Web开发,用哪个平台哪种语言其实本质上没有太大的区别,因为Web开发框架已经非常成熟,只要符合需求,能按时交付产品就ok了. 要选择哪个平台,是 ...

最新文章

  1. 无法访问linux mysql_远程无法访问linux Mysql解决方案(转)
  2. web scraper 抓取网页数据的几个常见问题
  3. php运行速度检测软件,PHP执行慢分析工具xdebug + webgrind
  4. php mysql 编码为utf-8_php连mysql用 utf-8编码乱码怎么办
  5. C++中堆和栈的完全解析
  6. Liunx安装 jemalloc == 内存管理工具
  7. 他说,编程的黄金时代已到
  8. RS_code 编码和解码
  9. matlab非线性超定方程组求代数解,非线性超定方程组求解
  10. 阿里云邮件推送使用方法
  11. 矩形波导中TE波和TM波的截止波数截止波长和截止频率
  12. 凑热闹,列个非主流书单:(1)分析与解决问题、通用管理(2)技术管理/CTO...
  13. JQ获取本地JSON文件中的数据 模拟分页效果 - 初学
  14. 常用排序算法总结与英文翻译
  15. Java—九九乘法表
  16. 深度技术ghost官方原版XP系统sp3下载地址
  17. 【转】世上万事,不过是一懒二拖三不读书
  18. PRML 学习: (1) Polynomial Curve Fitting
  19. 从Internet说起
  20. html怎么消除打印的进纸,打印机进纸打印故障解决秘方实例

热门文章

  1. VMware vSphere 7 服务器ESXi虚拟化HA高可用解决方案
  2. php爬取ckplayer,CKplayer站外调用示例附最终效果
  3. java获得一个空闲端口号_Python找出9个连续的空闲端口
  4. centos7使用yum安装jdk并配置jdkhome
  5. Mysql之case when用法总结
  6. 彻底理解Spring IOC和DI
  7. Python虚拟环境pyenv、venv(pyvenv)、virtualenv之间的区别,终于搞清楚了!
  8. 查找内存泄漏的一个思路
  9. angularjs php登录验证,AngularJs表单验证的方法
  10. 怎样格式化电脑_160G移动硬盘做PE启动盘 要怎样做