cookie是什么:

cookie是由web服务器保存在用户浏览器(客户端)上的小文件,它可以包含用户信息,用户操作信息等等,无论何时访问服务器,只要同源,就能携带到服务端

常见方式

  1. 一般:请求一个接口,返回是否登录,如果登录成功,服务器(set-cookie)设置cookie到浏览器,以后请求api会继续请求
  2. jwt:将用户id.payload.签证进行加密,并且注入到客户端cookie,之后每次请求会在服务端解析该cookie,并获取对应的用户数据,由于存在客户端,所以解放了服务端,减少服务端压力。也可以将该cookie放到根域名下,这样就可以登录一次,遍地开花。

可以看到,常见的方式都是利用cookie(或者浏览器storage),这样你的信息还是会被看到,如果别人获取到你的cookie也有办法进行破解甚至直接复制登录。那么有没有办法不借用cookie来记录用户信息的?


利用缓存存储用户信息

  1. 优点:安全可靠
  2. 缺点:依赖服务端

原理概述:

请求一个资源,如果设置cache-control、lastmodify、etag等,会进行缓存相关的判定:

  1. cache-control:是否强缓存,如果命中直接读取浏览器缓存的上次返回内容
  2. last-modify:如果未命中强缓存,进行时间的判断,如果有if-modified-since并且和last-modify那么读取缓存,否则重新拉取资源
  3. 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记录用户信息的更多相关文章

  1. cookie记录用户的浏览商品的路径

    在电子商务的网站中,经常要记录用户的浏览路径,以判断用户到底对哪些商品感兴趣,或者哪些商品之间存在关联. 下面将使用cookie记录用户的浏览过的历史页面.该网站将每个页面的标题保存在该页面的$TIT ...

  2. java 使用cookie记录用户上一次访问的时间 记住 用户的 登录名

    package cn.itcast.cookie; import java.io.IOException; import java.io.PrintWriter; import java.util.D ...

  3. 10 ~ express ~ 使用 cookie 保存用户 信息

    思维导图: (1) 保存 cookie (2)销毁 cookie 一,保存 cookie 1,app.js  . 新增代码 var Cookies = require('cookies') /** * ...

  4. 使用cookie记录用户上次访问网页的时间,并返回到页面

    package com.hopetesting.cookie;import javax.servlet.ServletException;import javax.servlet.annotation ...

  5. jQuery 操作cookie保存用户浏览信息

    使用jQuery操作cookie之前需要引入jQuery的一个cookie小组件js,代码如下:   /*         jQuery cookie plugins */jQuery.cookie ...

  6. spring security实现记录用户登录时间等信息

    目录 spring security实现记录用户登录时间等信息 一.原理分析 二.实现方式 2.1 自定义AuthenticationSuccessHandler实现类 2.2 在spring-sec ...

  7. oracle 执行 delete user$ 误删所有用户信息后的数据恢复流程

    起因: 在oracle测试过程中,不小心执行了delete user$ 命令,导致oracle当前实例所有的用户信息丢失,包括sys用户. 第一次使用DUL工具数据恢复:失败 下载ParnassusD ...

  8. net mvc中实现记录用户登录信息(记住登录效果)

    现记录用户登录信息(记住登录效果) 本文讲述了使用cookies实现网站记住登录效果,效果如下: 主要实现方法,当用户选择记住登录时建立cookies保存用户名和用户密码,当用户登录不选择记住登录时, ...

  9. 使用Cookie实现用户商品历史浏览记录

    该功能分为四个模块: 1. 获取所有商品并以链接的形式显示 out.write("网站商品: <br/>"); Map<String, Book> book ...

随机推荐

  1. noip11 string

    这道题改题时我打了个玄学复杂度的暴力,然后我成功的造了一组数据hack掉了自己的代码.... 通过观察,我们可以很容易的发现在操作几次后,整个序列就会变成一块一块相同的字母. 于是我们可以对我们的暴力 ...

  2. Helm 3 发布 | 云原生生态周报 Vol. 27

    作者 | 墨封.元毅.冬岛.敖小剑.衷源 业界要闻 1.Helm 3 发布 美国时间 11 月 13 日,Helm 团队发布 Helm 3 第一个稳定版本.Helm 3 以 Helm 2 的核心特性为 ...

  3. PHP实现开发者模式出现该公众号提供的服务出现故障 请稍后再试解决方法

    PHP实现开发者模式出现该公众号提供的服务出现故障 请稍后再试解决方法 仔细检查下有没有echo等输出的代码  echo没有输出东西 就是报这个信息  所以调试信息都必须写入日记

  4. GitHub 发布了官方 App,还打算冰封你的代码一千年

    11 月 13 日,GitHub Universe 2019 开发者大会上,公布了大量新功能,包括发布 GitHub 移动版.GitHub Actions 和 Packages 正式版上市.重新设计了 ...

  5. @Transactional 的回滚

    默认情况下,Exception是不会引起回滚操作的,RuntimeException才会引起回滚操作. 当然如果所有的Exception都要回滚的话,直接@Transactional(rollback ...

  6. 《计算机网络 自顶向下方法》 第3章 运输层 Part1

    由于个人精力和智商有限,又喜欢想太多.钻牛角尖,导致学习系统性知识很痛苦,尝试改变学习方式,慢慢摸索 现在看到 rdt2.0,又有点看不下去 现在的想法: 要有个目标,且有截止时间(作业模式.考试模式 ...

  7. LoadRunner具体流程

    创建负载测试场景场景目标:模拟10个用户同时登陆.搜索航班.购买机票.查看航班路线并退出打开Controller并创建一个新场景1.打开HP LoadRunner2.打开Controller在Load ...

  8. 公众号第三方平台开发 component_verify_ticket和accessToken的获取

    公众号第三方平台审核通过之后,微信的服务器会定时(10分钟一次)给"授权事件接收URL"发送component_verify_ticket,这里我们需要及时更新component_ ...

  9. Centos上通过shell脚本备份数据库

    #!/bin/bash ds=`` list=`date +%Y`/`date +%m` dname="callme" eval "mkdir -p $list" ...

  10. i7-9700也能安装Windows7

    商家说,i7-8700以上不支持Win7,只能安装Win10.我在手机网上也看过同样的说明,是微软与Intel联合行动,意在强迫用户升级到Win10.文章后面有,并不是不能装win7,是没有提供win ...