*参考koa-session源码html
1.第一次向服务器发送请求时在服务器端建立Session对象,该对象有一个惟一的IDjava
2.在建立Session对象的同时会建立一个特殊的Cookie对象,该Cookie对象的名字是一个固定值JSESSIONID,该对象的值就是Session对象的ID值,同时会将这个特殊的Cookie对象发送给浏览器.mysql
3.之后浏览器在发送就会携带这个特殊的Cookie对象git
4.服务器获取JESSIONID的这个Cookie对象的value以后,在服务器中查找与之想对应的Session对象,来区分不一样的用户github
session对象的获取 :HttpSession session = request.getSession()redis
能够用以下的代码证实:sql
package xdp.gacl.session;数据库
import java.io.IOException; import javax.servlet.ServletException;apache
import javax.servlet.http.HttpServlet;npm
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class SessionDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF=8"); response.setContentType("text/html;charset=UTF-8"); //使用request对象的getSession()获取session,若是session不存在则建立一个 HttpSession session = request.getSession(); //将数据存储到session中 session.setAttribute("data", "是个麻瓜"); //获取session的Id String sessionId = session.getId(); //判断session是否是新建立的 if (session.isNew()) { response.getWriter().print("session建立成功,session的id是:"+sessionId); }else { response.getWriter().print("服务器已经存在该session了,session的id是:"+sessionId); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } 复制代码
}
服务端:
对象序列化
的技术来实现的:当须要从新加载Session对象时(如服务器再次启动的时候),经过对象反序列化
的技术在内存中从新构造Session对象。Tomcat
经过Session Manager来建立和维护HTTP Session,当你没有配置其它的Session Manager实现时,默认使用StandardManager类。StandardManager在Tomcat服务器正常关闭、重启或者Web应用程序中止时,将内存中的全部活动的HttpSession对象序列化到硬盘文件中;当Web应用程序从新开始运行时,发序列化HttpSession对象,在内存中从新构建HttpSession对象,以及HttpSession中保存的全部对象(假定HttpSession对象没有过时)。这种方式须要安装koa-session-minimal和koa-mysql-session两个依赖。 执行
npm install koa-session-minimal koa-mysql-session --save 项目配置:
const session = require('koa-session-minimal');
const MysqlStore = require('koa-mysql-session');
const config = require('./config/default.js'); // 数据库配置
const Koa = require('koa');
const app = new Koa();
// session存储配置 const sessionMysqlConfig = { user: config.database.USERNAME, password: config.database.PASSWORD, database: config.database.DATABASE, host: config.database.HOST, };
// 配置session中间件 app.use(session({ key: 'USER_SID', store: new MysqlStore(sessionMysqlConfig) }));
这种方式会自动在数据库创建一个表 在浏览器的cookie中会生成一个以 USER_SID 为键的cookie。经过ctx的session属性能够修改更新删除session的值。 缺点
是每次对session的操做须要查询数据库,比较耗时。
主要用到了koa-session2和ioredis。 执行
npm install koa-session2 ioredis --save 具体实现代码参考下面的
项目实践与测试
部分
每次登录能够经过Redis来存储会话信息,因为Redis直接是运行在内存中的,所以速度会比较快。 经过get key 便可查看相应的session信息。
Redis是一款开源的、高性能的键-值存储(key-value store)。它常被称做是一款数据结构服务器(data structure server)。
Redis集群~windows下搭建Sentinel环境及它对主从模式的实际意义:
使用ioredis存储session的具体步骤: 参考ioredis的接口文档,提供sentinel环境redis的存储
在管理系统项目中实现redis对session的存储,其中,redis为哨兵模式集群
redis: {
//哨兵部署 sentinels: [ { host: '127.0.0.1', port: 26379 },{ host: '127.0.0.1', port: 26380 }, { host: '127.0.0.1', port: 26381 } ], //加这个才能够找到主服务器 name:"mymaster", } 复制代码
const Store = require('./app/redis/redis-store');
app.use(session({
store:new Store(config.redis),
maxAge: 86400000 }))
//redis处理session持久化
app.use(require('./app/interceptors/redis-session'))
'use strict'; const config = require('config');
module.exports=async (ctx,next)=>{
ctx.destroySession=function () {
var self = this; // console.log("destroySession") if(self.session){ self.session=undefined; // console.log("shanchu") return true; }else{ return false; } 复制代码
}; await next();
}
async function (ctx, next) { const self = this; try {
// 若是已经登陆,则直接返回 if (ctx.hasLogin()) { ctx.destroySession();//删除session resp.success({ data: true }, ctx); } } catch (e) { resp.failed({ desc: e.toString() }, ctx); } finally { // 执行流程交给下一个middle-ware await next(); } 复制代码
}
运行项目以前按照上述sentinel环境的搭建指南搭建环境,并在项目中安装相关的库后运行项目