不使用cookie记录用户信息
cookie是什么:
cookie是由web服务器保存在用户浏览器(客户端)上的小文件,它可以包含用户信息,用户操作信息等等,无论何时访问服务器,只要同源,就能携带到服务端
常见方式
- 一般:请求一个接口,返回是否登录,如果登录成功,服务器(set-cookie)设置cookie到浏览器,以后请求api会继续请求
- jwt:将用户id.payload.签证进行加密,并且注入到客户端cookie,之后每次请求会在服务端解析该cookie,并获取对应的用户数据,由于存在客户端,所以解放了服务端,减少服务端压力。也可以将该cookie放到根域名下,这样就可以登录一次,遍地开花。
可以看到,常见的方式都是利用cookie(或者浏览器storage),这样你的信息还是会被看到,如果别人获取到你的cookie也有办法进行破解甚至直接复制登录。那么有没有办法不借用cookie来记录用户信息的?
利用缓存存储用户信息
- 优点:安全可靠
- 缺点:依赖服务端
原理概述:
请求一个资源,如果设置cache-control、lastmodify、etag等,会进行缓存相关的判定:
- cache-control:是否强缓存,如果命中直接读取浏览器缓存的上次返回内容
- last-modify:如果未命中强缓存,进行时间的判断,如果有if-modified-since并且和last-modify那么读取缓存,否则重新拉取资源
- etag:如果未命中强缓存,通过etag唯一标志福来判断是否需要拉取最新资源,etag一般用文件内容的hash加密后内容,如果是大文件,个人建议使用文件大小+最后修改时间作为唯一标志
综上所述,如果我们请求一个很小的资源文件,例如1字节的图片,服务端设置cache-control: max-age=0,跳过强缓存,服务端设置etag,保证每次都做协商缓存,然后根据etag的变化来决定是否需要拉新(记录用户信息),如果etag没有变化,那么就读取缓存(缓存记录用户信息)
代码示例
const Koa = require('koa');
const KoaBody = require('koa-body');
const fs = require('fs');
const path = require('path');
const glob = require('glob');
const baseDate = {
visitCount: 1,
date: undefined,
info: ''
};
const app = new Koa();
app.use(KoaBody());
app.use(async ctx => {
// 更新资源
if (ctx.req.url === '/updateInfo' && ctx.req.method === 'POST') {
const session = require('./session.json');
session.info = ctx.request.body.info;
await writeFile('session.json', JSON.stringify(session));
ctx.body = {
code: 1
};
}
const imgType = glob
.sync('*.+(jpg|png)')
.map(file => path.resolve('/', file));
if ((fileIndex = imgType.indexOf(ctx.req.url)) !== -1) {
const res = ctx.response;
const req = ctx.req;
res.type = path.extname(imgType[fileIndex]).slice(1);
const filePath = path.join('./', imgType[fileIndex]);
res.set('cache-control', 'public, max-age=0');
let session;
try {
session = require('./session.json');
} catch (e) {
session = {...baseDate};
session.date = new Date().toLocaleString();
await writeFile('session.json', JSON.stringify(session));
} finally {
// use force refresh to clear etag, because if serve set etag,
// browser will carry if-none-match field in request header. and we can use if-none-match to judge somethine
// etag 大文件一般用文件大小 + 修改时间 来生成,而不是读取文件内容
md5 = convertMd5(JSON.stringify(session));
res.etag = md5;
if (req.headers['if-none-match']) {
// console.log('缓存');
session.visitCount = +session.visitCount + 1;
session.date = new Date().toLocaleString();
await writeFile('./session.json', JSON.stringify(session));
res.status = 304;
} else {
// console.log('清除缓存');
session.visitCount = 1;
session.date = new Date().toLocaleString();
session.info = '';
await writeFile('./session.json', JSON.stringify(session));
ctx.body = fs.createReadStream(filePath);
}
}
}
});
app.listen(3000);
运行demo
有问题欢迎交流
不使用cookie记录用户信息的更多相关文章
- cookie记录用户的浏览商品的路径
在电子商务的网站中,经常要记录用户的浏览路径,以判断用户到底对哪些商品感兴趣,或者哪些商品之间存在关联. 下面将使用cookie记录用户的浏览过的历史页面.该网站将每个页面的标题保存在该页面的$TIT ...
- java 使用cookie记录用户上一次访问的时间 记住 用户的 登录名
package cn.itcast.cookie; import java.io.IOException; import java.io.PrintWriter; import java.util.D ...
- 10 ~ express ~ 使用 cookie 保存用户 信息
思维导图: (1) 保存 cookie (2)销毁 cookie 一,保存 cookie 1,app.js . 新增代码 var Cookies = require('cookies') /** * ...
- 使用cookie记录用户上次访问网页的时间,并返回到页面
package com.hopetesting.cookie;import javax.servlet.ServletException;import javax.servlet.annotation ...
- jQuery 操作cookie保存用户浏览信息
使用jQuery操作cookie之前需要引入jQuery的一个cookie小组件js,代码如下: /* jQuery cookie plugins */jQuery.cookie ...
- spring security实现记录用户登录时间等信息
目录 spring security实现记录用户登录时间等信息 一.原理分析 二.实现方式 2.1 自定义AuthenticationSuccessHandler实现类 2.2 在spring-sec ...
- oracle 执行 delete user$ 误删所有用户信息后的数据恢复流程
起因: 在oracle测试过程中,不小心执行了delete user$ 命令,导致oracle当前实例所有的用户信息丢失,包括sys用户. 第一次使用DUL工具数据恢复:失败 下载ParnassusD ...
- net mvc中实现记录用户登录信息(记住登录效果)
现记录用户登录信息(记住登录效果) 本文讲述了使用cookies实现网站记住登录效果,效果如下: 主要实现方法,当用户选择记住登录时建立cookies保存用户名和用户密码,当用户登录不选择记住登录时, ...
- 使用Cookie实现用户商品历史浏览记录
该功能分为四个模块: 1. 获取所有商品并以链接的形式显示 out.write("网站商品: <br/>"); Map<String, Book> book ...
随机推荐
- [考试反思]NOIP模拟测试19:洗礼
[]260 []230[]210 []200[8]170[9]160 这套题一般,数据很弱,T1T2暴力都能A,而且都是一些思维题,想不到就爆0. 原因不明,很多一直很强的人在这一次滑铁卢了,于是我个 ...
- 如何在Vue-cli项目中使用JTopo
1.前言 jTopo(Javascript Topology library)是一款完全基于HTML5 Canvas的关系.拓扑图形化界面开发工具包.其体积小,性能优异,由一群开发爱好者来维护.唯一感 ...
- 九:写了一下红帽免费的centos6的安装步骤
linux centos 6安装方法 前提需要: 1, centos6的镜像文件 2,VMware 提前安装 注:获取镜像 阿里开源系统,此处可下载其他的 1.Ubuntu 2.Susa 3.Cent ...
- 重置root密码!
偶尔把密码忘记了也不用慌,重置密码只需简单几步: 第1步:开机后在内核上敲击“e”. 第2步:在linux16这行的后面输入“rd.break”并敲击“ctrl+x“. 第3步:进入到了系统的紧急求援 ...
- python——高阶函数:高阶函数
python高阶函数 00初识高阶函数 一等公民 函数在python中是一等公民(First-Class Object),同样和变量一样,函数也是对象,只不过是可调用的对象,所以函数也可以作为一个普通 ...
- centos6的JDK安装
1. 通过如下命令查看当前操作系统是否存在JDK rpm -qa | grep java 如果出现以下内容说明你的操作系统存在jdk 2.那么依次通过如下命令进行删除它 rpm -e - -nodep ...
- docker——harbor
为什么要用harbor? 在实际生产运维中,往往需要把镜像发布到几十.上百台或更多的节点上.这时单台Docker主机上镜像已无法满足,项目越来越多,镜像就越来越多,都放到一台Docker主机上是不行的 ...
- EXISTS的用法介绍
比如在Northwind数据库中有一个查询为 SELECT c.CustomerId,CompanyName FROM Customers c WHERE EXISTS( SELECT OrderID ...
- deepin 15.11添加应用启动图标
以postman为例(路径要按需修改) 1.建立软链接 sudo ln -s /home/lixing/software/Postman/Postman /usr/bin/postman 前面地址为安 ...
- 公众号第三方平台开发 component_verify_ticket和accessToken的获取
公众号第三方平台审核通过之后,微信的服务器会定时(10分钟一次)给"授权事件接收URL"发送component_verify_ticket,这里我们需要及时更新component_ ...