java会话技术--02--服务器session共享

2023-11-03

java会话技术–02–服务器session共享


1、原理图

这里写图片描述

2、代码实现

2.1、接口代码

package cn.zhou.common.web.session;

import java.io.Serializable;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 
 * session供应类
 * @author Administrator
 *
 */
public interface SessionProvider {
	//往Session设置值
	//name Constants  buyer_session
	//value   用户对象 Serializable value 是对象序列化,用于远程session
	public void setAttribute(HttpServletRequest request, String name,Serializable value,HttpServletResponse response);
	
	//从Session中取值
	public Serializable getAttribute(HttpServletRequest request,String name,HttpServletResponse response);
	
	//退出登陆
	public void logout(HttpServletRequest request,HttpServletResponse response);
	
	//获取SessionID
	public String getSessionId(HttpServletRequest request,HttpServletResponse response);
}

2.2、实现代码

package cn.zhou.common.web.session;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;

import com.danga.MemCached.MemCachedClient;
/**
 * 远程Session
 * 存放在Memcached缓存服务器里的Session
 * @author lx
 *
 */
public class CacheSessionProvider implements SessionProvider {
	@Autowired
	private MemCachedClient  memCachedClient;
	private final String SESSIONID="sessionId";
	//设置数据保存在memcached的保存时间
	private final Integer  expiry=30*60;

	/**
	 * 将session的值通过sessionId值存入memcached中
	 */
	public void setAttribute(HttpServletRequest request, String name, Serializable value,HttpServletResponse response) {
		// TODO Auto-generated method stub
		Map<String, Serializable> session=new HashMap<String, Serializable>();
		session.put(name, value);
		String sessionId=getSessionId(request, response);
		memCachedClient.set(sessionId, session, expiry);
	}
/**
 * 通过用户本地的sessionId值到服务器获取session
 * 从缓存服务器memcached中获取sessionId值对应的session
 */
	public Serializable getAttribute(HttpServletRequest request, String name,HttpServletResponse response) {
		// TODO Auto-generated method stub
		String sessionId=getSessionId(request, response);
		Map<String, Serializable> session = (Map<String, Serializable>)memCachedClient.get(sessionId);
		//返回保存在session中的用户数据
		if(session!=null){
			return session.get(name);
		}
		return null;
	}
	/**
	 * 
	 * 删除缓存服务器memcached中中key=sessionId,这样用户即使
	 * 通过本地的sessionID也获取不到用户的数据
	 */
	public void logout(HttpServletRequest request,HttpServletResponse response) {
		// TODO Auto-generated method stub
		//用户本地cookie
		String sessionId=getSessionId(request, response);
		if(memCachedClient.keyExists(sessionId)){
			memCachedClient.delete(sessionId);
		}

	}
/**
 * 获取sessionId,如果用户没有sessionId,则为用户创建一个sessionId
 */
	public String getSessionId(HttpServletRequest request,HttpServletResponse response) {
		//获取存储在cookie的sessionId
           Cookie[] cookies = request.getCookies();
           if(cookies!=null && cookies.length>0){
        	   for (Cookie cookie : cookies) {
        		   if(SESSIONID.equals(cookie.getName())){
        			   return cookie.getValue();
        		   }
			}
           }
           //如果没有sessionId,为用户创建一个
           String sessionId=UUID.randomUUID().toString().replaceAll("-", "");
           Cookie cookie=new Cookie(SESSIONID, sessionId);
           cookie.setMaxAge(-1);// 默认-1,代表关闭浏览器就销毁cookie
           cookie.setPath("/");
           response.addCookie(cookie);
		return sessionId;
	}

}

2.3、本地实现代码

该代码只用于项目还没有发布上去,没有实现session共享,开发自己用的本地session
session共享实现代码与本地session代码共同实现同一个接口,目的是为了未来需要将本地session改为session共享的实现代码,bean那边接口名不需要改,只要改实现类,这样注解 session 接口 实例化就是session共享的对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java会话技术--02--服务器session共享 的相关文章

随机推荐

  • java架构师进阶之路

    Java架构师 应该算是一些Java程序员们的一个职业目标了吧 很多码农码了五六年的代码也没能成为架构师 那成为Java架构师要掌握哪些技术呢 总体来说呢 有两方面 一个是基础技术 另一个就是组织能力和提出解决方案能力了 如果你是想成为Ja
  • Netty入门-Channel

    目录 Channel详解 Channel的特点 Channel接口方法 ChannelOutboundInvoker接口 AttributeMap接口 ChannelHandler接口 ChannelInboundHandler接口 Cha
  • 请取件

    Part1前言 最常见的鼠标平移算法是平行于水平面 地面 的 无论相机视角如何 平移时 相机的世界Z值始终不变 因为绝大多数场景都是在观察地面上的物体 而人类的行走总是平行于地面的 但是本文要介绍的另一种小众的平移算法则平行于视锥体的截面
  • JPA使用审计功能新增时, 不自动更新@LastModifiedDate和@LastModifiedBy字段

    JPA使用审计功能新增时 不自动更新 LastModifiedDate和 LastModifiedBy字段 疑问 查询源码 解决方案 疑问 JPA使用审计功能 网上有一大堆demo 但是使用时 会发现创建的时候会自动填写 LastModif
  • Mac安装homebrew报错curl: (7) Failed to connect to raw.githubusercontent.com port 443: Operation

    homebrew安装时 一般直接在终端直接输入命令 usr bin ruby e curl fsSL https raw githubusercontent com Homebrew install master install 但是这个方
  • Numpy/Pytorch之数据类型与强制类型转换

    目录 1 数据类型简介 Numpy Pytorch 2 Python的type 函数 3 Numpy Pytorch的dtype属性 4 Numpy中的类型转换 先聊聊我为什么会用到这个函数 不看跳过 astype 函数 输出 4 Pyto
  • 【线性表的原地逆置】

    目录 前言 一 顺序表 数组 一 双指针 二 单链表 一 模拟顺序表的双指针 交换的节点的值域 二 头插法 改变节点的指针域 三 递归实现 将整体链表反向 整体代码 总结 前言 打怪升级第一天 大家好 今天我们来了解一下数组和单链表的原地逆
  • (mybatis驼峰命名导致映射错误)

    今天在复习mybatis时遇到这样的一个问题 我数据库表的字段和我定义的实体类名不一致 中间有下划线 如下图 实体类 数据库字段 结果会导致部分查询数据是null 于是我首先想到了自己定义一个resultmap映射 给数据库字段取一个别名
  • Android 学习之多状态布局的一种实现方案

    开发应用的过程中 首页的控件越来越多 布局文件的代码已经到了爆表的程度 而且不同状态下首页各个控件的 Visibility 不同 每次新增状态都是一件头疼的事情 时常遗漏控件导致出错 和 YYY 大佬交流讨论后他给出了一种巧妙的方案 特此学
  • 人工智能数学基础:费马引理、罗尔定理、拉格朗日微分中值定理、柯西中值定理

    一 费马 Fermat 引理 费马 Fermat 引理 设函数f x 在点x0的某邻域U x0 内有定义 并且在x0处可导 如果对任意的x U x0 有f x f x0 或f x f xo 那么f x0 0 老猿认为费马引理就是说明 对于某
  • 简单通俗易懂:一个小例子完美解释Naive Bayes(朴素贝叶斯)分类器

    更多深度文章 请关注 https yq aliyun com cloud 最简单的解决方案通常是最强大的解决方案 而朴素贝叶斯就是一个很好的证明 尽管机器学习在过去几年取得了巨大的进步 但朴素贝叶斯已被证明不仅简单 而且快速 准确 可靠 它
  • 从原理到代码实践

    文章目录 1 损失函数原理 1 1 Classification Error 分类错误率 1 2 均方差损失 1 3 交叉熵损失函数 1 3 1 数学原理 1 3 2 代码实现 对于图像分类任务 模型最终是通过softmax操作输出一个概率
  • Java: String与其他数据的相互转化

    1 java lang包中的Byte Short Long Float Double类调用相应的类方法 将由 数字 字符组成的字符序列转化为相应的基本数据类型 public static byte parseByte String s th
  • 如何制作点餐小程序?

    随着移动互联网的发展 点餐小程序的出现越来越受到大家的欢迎 它方便快捷 可以随时随地点餐 特别是在疫情期间更受到了用户的喜爱 那么 如何制作一个点餐小程序呢 下面将会简单介绍一下步骤 并通过一个具体案例来解析运用了哪些技巧提升了效果 一 确
  • 容器 - unordered_map

    unordered map是C Boost库中的内容 这里的unordered指的是散列式的存储方式 unordered库提供了两个散列映射表 unordered map和unordered multimap 利用散列表代替了二叉树的实现
  • 11. Leaf-segment 分布式ID

    Spring Cloud 微服务系列文章 点击上方合集 1 开头 当应用程序只使用单个数据库时 可以使用数据库自增的方式来生成id 这种方式既简单 查询又快 然而 当应用程序需要进行分库分表时 即将数据分散到多个数据库和数据表中 使用数据库
  • catia如何将曲面加厚变为实体_CATIA如何将片体转换为实体?

    下面介绍一种在CATIA中将片体转换为实体的方法 1 首先打开CATIA软件 再打开需要曲面操作的模型零件 2 然后进入创成式外形设计模块 在软件界面的开始菜单栏中点击开始 形状 创成式外形设计 3 接下来从实体中提取面 先使用 提取 命令
  • 设计规范-导航、弹窗、视图

    常见导航样式 根据产品的特性 导航可以混合使用 体现形式多样化 不能为了追求多样化 滥用导航类型 扁平式导航 在一级页面提供导航栏 一般处于顶部 底部 适合频繁切换的模块 方便用户在不同的模块间操作 例 微信的底部导航栏 小红书的顶部 底部
  • LADRC的学习——用simulink搭建仿真模型

    作者 墨心 时间 2019 7 25 用simulink搭建仿真模型 前面两篇博客主要讲了ADRC的相关概念和知识 并且尝试着搭建模型和仿真 之后学习了PID的相关知识 了解了Kp Ki Kd三个参数的意义 接下来 主要根据高志强教授的论文
  • java会话技术--02--服务器session共享

    java会话技术 02 服务器session共享 1 原理图 2 代码实现 2 1 接口代码 package cn zhou common web session import java io Serializable import jav