redis 数据库 (存放token,做为辅助数据库)css
redis 查询速度快,可是做为内存数据库,没法存储过大数据。存放缓存有助于提升性能
mysql 数据库 (存放大规模数据,做为主数据库)html
存储在硬盘中。能够支持更大规模的数据,成本更低。
建了一个 关联指定答卷人和试卷table,
建表 就须要先在 指定答卷人和试卷table 里根据user_id获得他所须要考试的全部试卷,而后逐个筛选状态和关键字
将数据库操做经过实例对象的语法完成。使用框架sequlize
命名规范:前端
books
对应类Book
。mice
对应类Mouse
,表people
对应类Person
。book_clubs
对应类BookClub
,表line_items
对应类LineItem
。id
的整数字段。外键字段名约定为单数的表名 + 下划线 + id,好比item_id
表示该字段对应items
表的id
字段。感受这样好复杂,有没有更好的建表方式,或者处理方式?vue
1.RES非对称加密:加密解密的秘钥不一样,私钥加密,公钥解密。mysql
使用加密插件crypto,进行RES非对称加密+md5不可逆加密jquery
关于加密解密引用一则动漫解读:https://mp.weixin.qq.com/s/1ojSrhc9LZV8zlX6YblMtAwebpack
网站攻击经常使用的两种方式:XSS,CSRF;ios
CSRF:查看wiki解释。
防护方式:1.检查refrence 字段 2.添加token
CSS:代码注入git
防护措施:htmlentites 过滤输出。
JWT 优势:github
JWT缺点:
设置token自动刷新时间
> 1. 当时access_token 失效时,根据access_toke获得refresh_token判断是否有效。
> 2. 有效返回新的access_token给客户端,设置Authorization。将新的access_token 和refresh_token存入redis数据库。
> 3. 无效从新登陆。
>
具体使用能够参考文档webpack中文网
const path = require('path'); function resolve(_dir) { return path.join(__dirname, _dir) } const webpack = require("webpack") let webpackConfig = { configureWebpack: { plugins: [ new webpack.ProvidePlugin({ $: "jquery", jQuery: "jquery", "windows.jQuery": "jquery" }), ] }, chainWebpack: config => { config.resolve.alias.set('@', resolve('/src')); config.resolve.symlinks(true); }, devServer: { hot: true, disableHostCheck: true, // 设置代理 proxy: { '/': { ws: false, target: 'http://localhost:3000', changeOrigin: true, //为true,本地能够虚拟一个服务器接受请求并代理发送该请求 pathRewrite: { '^/': '/' } }, } }, css: { extract: false } } module.exports = webpackConfig;
路径 :/src/main.js
项目执行获取公钥存储在浏览器localStorage
//获取公钥 Vue.prototype.$http({ method: 'get', url: "/publicKey", }).then((res) => { res = res.data; if (res.code == 200) { window.localStorage.setItem("public_key", res.msg); } })
import axios from 'axios'; import router from './router'; //定义一个路由防卫,每次路由跳转,咱们都来作一下权限校验 router.beforeEach((to, from, next) => { if (to.meta.requireAuth) { // 判断该路由是否须要登陆权限 if (localStorage.token&&localStorage.token!='') { //判断token是否存在 console.log("token存在"); next(); } else { console.log("token不存在"); next({ path: '/login', // 将跳转的路由path做为参数,登陆成功后跳转到该路由 query: {redirect: to.fullPath} }) } } else { // 若是不须要权限校验,直接进入路由界面 next(); } }); // http request 拦截器 axios.interceptors.request.use( config => { if (localStorage.token) { //判断token是否存在 config.headers.Authorization = localStorage.token; //将token设置成请求头 } return config; }, err => { return Promise.reject(err); } ); // http response 拦截器 axios.interceptors.response.use( response => { if (response.data.code === 401) { router.replace('/login'); console.log("token过时"); }else if(response.headers.authorization){ localStorage.token=response.headers.authorization; } return response; }, error => { return Promise.reject(error); } ); export default axios;
摸索学习,有什么不对的欢迎指教。