MZY项目笔记:session歧路
from my typora
MZY项目笔记:session歧路
文章目录
- MZY项目笔记:session歧路
- 那该怎么办?
- 1. 手动加上cookie的header。
- 2.自己模拟一个SessionContext。
- 但是这样就能解决了吗?现在前端访问后台我就能把session对应起来了吗?
- 3.引入token机制
以前对session的理解不够透彻,今天跪着来补。
前因是因为项目问题:
在浏览器中,一个浏览器多次请求默认状态下只会有一个sessionId,但是当两边都是服务端的时候,每次重复请求,此时会被服务端当成不同的请求来处理!
前后台分离之后,前后台运行在不同的容器上,每次前端请求都会被后台认为是一次新的会话,在后台输出当前的sessionId发现,每次的sessionId都不一样,所以这种情况下没法做登录和数据接口的权限过滤操作。
那该怎么办?
开始了漫长的尝试歧路。
1. 手动加上cookie的header。
在第一次登录的时候,服务端把sessionId带给前端,前端把sesionId存到一个变量中。
在之后ajax的时候,提前加上cookie的header,把sessionId手动传上去,这样是不是就能让服务器识别,找到对应的会话了?
$.ajax({xhrFields: { withCredentials: true },type: "GET",url:"http://localhost:8080/getData",beforeSend: function(request) {// request.setRequestHeader("JSESSIONID", JSESSIONID);// request.setRequestHeader("Set-Cookie", JSESSIONID);request.setRequestHeader("Cookie", "JSESSIONID="+JSESSIONID);},dataType:"json",success: function(msg) {console.log(msg); }
});
400、bad request
以上都是不行的,在w3c的标准中直接就不允许:
以下转自的噢可爱滴蓝晶晶的CSDN:
w3c规定,当请求的header匹配以下不安全字符时,将被终止
Accept-Charset
Accept-Encoding
Connection
Content-Length
Cookie
Cookie2
Content-Transfer-Encoding
Date
Expect
Host
Keep-Alive
Referer
TE
Trailer
Transfer-Encoding
Upgrade
User-Agent
Via
2.自己模拟一个SessionContext。
在的SIHAIloveYAN的CSDN上看到了模拟session容器的文章:
// 以下是我的SpringBoot中的测试:// 创建一个自己的SessionContext
package club.mzywucai.cros_session_model.domain;import org.springframework.stereotype.Component;import javax.servlet.http.HttpSession;
import java.util.HashMap;/*** @author mzywucai* @Description* @date 2018/12/10*/
public class SessionContext {private static HashMap sessionMap = new HashMap();public static synchronized void AddSession(HttpSession session) {if (session != null) {sessionMap.put(session.getId(), session);}}public static synchronized void DelSession(HttpSession session) {if (session != null) {sessionMap.remove(session.getId());}}public static synchronized HttpSession getSession(String session_id) {if (session_id == null)return null;return (HttpSession) sessionMap.get(session_id);}
}// 创建一个监听器,每次session创建就add,session销毁就remove,防止内存泄漏
package club.mzywucai.cros_session_model.listener;import club.mzywucai.cros_session_model.domain.SessionContext;import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;/*** @author mzywucai* @Description* @date 2018/12/10*/
@WebListener
public class SessionListener implements HttpSessionListener {public void sessionCreated(HttpSessionEvent httpSessionEvent) {SessionContext.AddSession(httpSessionEvent.getSession());}public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {HttpSession session = httpSessionEvent.getSession();SessionContext.DelSession(session);}
}
但是这样就能解决了吗?现在前端访问后台我就能把session对应起来了吗?
如果我多次请求的话,多个session不就在内存里面炸了?我新请求一次,create一个session;虽然我从context中拿到了想要的session,但是同时岂不是也压入了很多没用的session?
原来servlet中的session不一定会被创建,我居然今天才知道。
就在我想这个问题的时候,我得知了一个惊天的大秘密!(所以我就加粗斜体写了?)
原来,只要我们不注入session就不会创建session!!!
回想起最初学servlet的时候,通过request拿到session的时候,是通过request.getSession(),getSession中有个boolean类型的参数:
getSession(true):
当内存中不存在session的时候就创建session。
getSession(false):
当内存中不存在session的时候就拿不到session(故此时的会话并不会创建session);
session的使用,其实是建立在一种假设用户回访才会使用的!!
果然知识需要回顾,不然这种简单的都会忘记
3.引入token机制
得到启发的帖子
这下大问题就真的没有了,我只在登录的时候,创建一个session,把登录的sessionId和一些关键信息加密组合作为token给前台并放入我的SessionContext中,后面的每次会话都是取现有的session,都不会再进行session的创建动作了(注意不要再在其它地方随便创建session了,因为前后台分离造成每次请求都是一次新的会话,会造成内存泄漏)!
<!DOCTYPE html>
<html><head><meta charset="utf-8" /><title>token测试</title></head><script src="js/jQuery_3.3.1.js"></script><script type="text/javascript">var token;$(document).ready(function(){$("#getData").click(function(){alert("click");$.ajax({ type: "GET",url:"http://localhost:8080/getData",beforeSend: function(request) {request.setRequestHeader("Authorization", token);console.log(token); },dataType:"json",success: function(msg) {console.log(msg); }}); });$.ajax({type: "POST",url:"http://localhost:8080/login",data: "username=mzy&password=123",dataType:"json",success: function(msg) {JSESSIONID = msg.data;if (msg.code == 0) {token = msg.data; }console.log("token="+token); }}); });</script><body><button id="getData">获取数据</button></body>
</html>
可以看到操作成功!
通过以上就可以把session存在我自己的容器里面,但是其实还是比较耗内存,因为这样需要把session在内存中存两份,服务器内置容器中一份,我自己的容器中一份。这个问题留着后面解决。
MZY项目笔记:session歧路相关推荐
- 涨薪神作,阿里内部火爆的实战文档和搭建项目笔记,你还怕没有项目可做吗
前言 认识一个事物最好的方式就是首先去了解它的历史. 随着Spring功能的不断丰富,版本的不断迭代发展,Spring 框架渐渐暴露出了一些问题和弊端.例如太多样板化的配置.繁琐复杂的使用过程等,我们 ...
- 瑞吉外卖项目笔记+踩坑1——基础功能
导航: [黑马Java笔记+踩坑汇总]JavaSE+JavaWeb+SSM+SpringBoot+瑞吉外卖+SpringCloud/SpringCloudAlibaba+黑马旅游+谷粒商城 目录 1 ...
- 《BI项目笔记》用Excel2013连接和浏览OLAP多维数据集
<BI项目笔记>用Excel2013连接和浏览OLAP多维数据集 原文:<BI项目笔记>用Excel2013连接和浏览OLAP多维数据集 用Excel2013连接和浏览OLAP ...
- 《BI项目笔记》创建标准维度、维度自定义层次结构
原文:<BI项目笔记>创建标准维度.维度自定义层次结构
- 【Andorid X 项目笔记】动态设置ViewPager的Adapter问题(2)
由于没有找到嵌套FragmentActivity的方法,只好打算用不同的FragmentPagerAdapter来动态切换ViewPager的,如下: /** * 首页切换的三个界面 ...
- 《BI项目笔记》数据源视图设置
原文:<BI项目笔记>数据源视图设置 目的 数据源视图是物理源数据库和分析维度与多维数据集之间的逻辑数据模型.在创建数据源视图时,需要在源数据库中指定包含创建维度和多维数据集所需要的数据表 ...
- 【Andorid X 项目笔记】禁用ListView的Fling功能(1)
前言 新的项目正在紧张开发中,初步估计2个月时间开发完成第一版,我负责Android端开发,由于不便过早公布,本系列将命名为"X项目笔记",并于项目结束后最终公布名称.本系列主要记 ...
- springboot配置shiro多项目实现session共享的详细步骤
springboot配置shiro多项目实现session共享的详细步骤 公司需要这样的需求: 有两个项目master 主项目.suiteone 项目,两个项目各自由shiro 安全框架管理,当不能登 ...
- 次世代的会话管理项目 Spring Session
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文来自云+社区翻译社,由Tnecesoc编译. 会话管理一直是 Java 企业级应用的重要部分.不过在很长的一段时间里,这一部分都被我们认 ...
- AppFuse项目笔记(1)
AppFuse项目笔记(1) 一.Appfuse简介 Appfuse是Matt Raible 开发的一个指导性的入门级J2EE框架,它对如何集成流行的Spring.Hibernate.ibatis.s ...
最新文章
- 摩卡业务服务管理(Mocha BSM)解决方案
- Document is invalid: no grammar found. at (null:3:8)
- 13 - java包装类
- NodeJs+Qunit的使用方式
- Unity Occlusion Culling 遮挡剔除研究
- Atitit 数据库表文档生成解决方案
- 顺序结构程序设计总结
- pdf安装包_PDF多功能格式转换器安装教程附安装包
- 高中生计算机考试软件手机版,信考中学信息技术考试练习系统内蒙古高中版
- 苹果7p大音频脚位图_苹果7P无声音与杂音维修案例
- 台式计算机关机后自行重启,台式电脑关机后自动重启怎么办?台式电脑关机后自动开机的处理办法...
- Matlab突然打不开,运行后一闪就消失了,任务管理器也没有的解决办法
- Python案例实操3-电影数据分析
- 感谢《蜗居》中的100句经典台词让我们提前认清了现实[转帖]
- Fibonacci Additions (区间加优化)
- 商丘学院计算机考研,商丘学院院校简介_商丘学院研究生院 - 中国考研网
- 顺序存储二叉树和线索化二叉树
- 【ARM汇编】打印金字塔 | 打印倒三角
- Java基础【08】常用API——RandomAccessFile相关API
- “.”和“->”的区别