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;
摸索學習,有什麼不對的歡迎指教。