電子商務就是建網站百度的營銷策略
一、localStorage 跟 sessionStorage有什么不同????
localStorage
1、生命周期:localStorage的生命周期是永久的,關閉頁面或瀏覽器之后localStorage中的數據也不會消失。localStorage除非主動刪除數據,否則數據永遠不會消失。
2、儲存大小: 5MB
3、獲取方式:localStorage.getItem(“key”)
4、應用場景:常用于長期登錄(+判斷用戶是否已登錄),適合長期保存在本地的數據。
sessionStorage
1、sessionStorage的生命周期是僅在當前會話下有效。sessionStorage引入了一個“瀏覽器窗口”的概念,sessionStorage是在同源的窗口中始終存在的數據。
1.1、只要這個瀏覽器窗口沒有關閉,刷新、進入同源另一個頁面,數據依然存在。
(同源:指"協議+域名+端口"三者相同,即便兩個不同的域名指向同一個ip地址,也非同源。 當協議、子域名、主域名、端口號中任意一個不相同時,都算作不同域。不同域之間相互請求資源,就算作“跨域”。)
(同源另一個頁面:指 當前《頁面1》為 localhost:8080,此時還沒有存sessionStorage,再次打開一個《頁面2》localhost:8080,《頁面1》此時登錄,sessionStorage.setItem 存儲之后在《頁面2》可以查看到存儲信息,如果這時再打開《頁面3》不會有存儲的信息 )
1.2、但是 sessionStorage 在關閉了瀏覽器窗口后就會被銷毀。同時獨立的打開同一個窗口同一個頁面,sessionStorage也是不一樣的。
《頁面1》關閉,不會影響《頁面2》的存儲信息,如果重新打開《頁面1》,sessionStorage存儲的信息也被銷毀
2、儲存大小: 5MB
3、獲取方式:sessionStorage.getItem(“key”)
4、應用場景:敏感賬號一次性登錄;
存在的問題:
“移動端sessionStorage緩存失效”,沒錯,就是概念沒理解透,導致在App里面獲取后為null,在PC端是正常的。
因為sessionStorage的生命周期是僅在當前會話下有效,移動端切換頁面是關閉原頁面打開新頁面,知道sessionStorage特性的朋友看到這里是不是瞬間理解了?
解決方案,我們知道sessionStorage被清空的原因是:移動端切換頁面是關閉原頁面打開新頁面,因此,在做移動端的時候,可以采用localStorage保存數據,使用完后再清空localStorage。
當然,如果是在同一個頁面中,sessionStorage的使用是沒有任何問題的。
二、session和cookie的區(qū)別是什么??
1、https://worktile.com/kb/p/38734
2、B站視頻:B站終于有人將Session和cookie講明白了!一節(jié)課徹底搞懂
Web3.0, 從1.0到3.0你不知道的互聯網的演進史!
https://cloud.tencent.com/developer/article/1419229
Session 、Cookie和Token三者的關系和區(qū)別
參考鏈接:
session的使用
https://www.cnblogs.com/lihuidu/p/6495247.html
sessionID相當于一個文件名稱, 里面存放的是
cookie的使用
1、cookie準備工作 前端頁面(端口 8080)
<template><div class="login"><h3>我在登錄頁面</h3><el-button v-if="isLoginFlag" @click="handleIsLogin('1')">我是免登錄,我想直接跳轉《結算頁面》</el-button><el-button v-if="isLoginFlag" @click="handleIsLogin('2')">我是免登錄,我想直接跳轉《詳情頁面》</el-button><div v-if="isLoginFlag">我已經登錄過了,現在有保存的cookie,可免登錄</div><el-form v-else :model="ruleForm" status-icon :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm"><el-form-item label="用戶信息" prop="userInfo"><el-input v-model="ruleForm.userInfo" autocomplete="off"></el-input></el-form-item><el-form-item label="密碼" prop="pass"><el-input type="password" v-model="ruleForm.pass" autocomplete="off"></el-input></el-form-item><el-form-item><el-button type="primary" @click="submitForm('ruleForm')">登錄</el-button><el-button @click="resetForm('ruleForm')">重置</el-button></el-form-item></el-form></div>
</template><script>
import axios from 'axios'
export default {name: 'login',data() {var validatePass = (rule, value, callback) => {if (value === '') {callback(new Error('請再次輸入密碼'));} else if (value !== this.ruleForm.pass) {callback(new Error('兩次輸入密碼不一致!'));} else {callback();}};return {isLoginFlag: false,ruleForm: {pass: '',userInfo: '',},rules: {pass: [{ required: true, validator: validatePass, trigger: 'blur' }],userInfo: [{ required: true, message: '請輸入用戶信息', trigger: 'blur' }],}};},created() {console.log('login-created')this.getUserInfo()},mounted() {console.log('login-mounted')},methods: {handleIsLogin(type) {if (type === '1') {this.$router.push({path: 'settlement',})} else {this.$router.push({path: 'details',})}},getCookieItem (sKey) {return (decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" +encodeURIComponent(sKey).replace(/[-.+*]/g, "\\$&") +"\\s*\\=\\s*([^;]*).*$)|^.*$",),"$1",),) || null);},getUserInfo() {axios.get('http://localhost:3000/userInfo').then( res => {console.log('userInfo-54-->', res)// console.log('323', this.getCookieItem('tokenId'))document.cookie.split(';').forEach(item => {if (item.includes('tokenId')) {const pageToken = item.split('=')console.log('item=->', pageToken)if (pageToken.length > 0) {// 我登錄了,不需要展示賬號密碼this.isLoginFlag = true} else {// 我的登錄狀態(tài)消失,需要輸入賬號密碼this.isLoginFlag = false}this.setStroageUserInfo(pageToken)// console.log()// 為什么要用 localstroage 存儲(sessionStroage),因為使用 store頁面刷新就消失,跨頁面我沒法保存,初始化當前頁面,保存的 cookie也會清空// 下次需要做的:// 怎么取cookie, document.cookie可以在這里獲取,// 1、使用 localstroage 存儲token// 2、研究 session// 3、cookie 相當于卡包,可以存多個key-value, Cookie不僅僅有名字和值兩個屬性,還有域(domain),過期時間(expires),路徑(path)等屬性。 其中,不同的域、不同的路徑下可以存在同樣名字的cookie。// 4、加油}})})},setStroageUserInfo(pageTokens) {console.log('123')if (pageTokens && pageTokens.length > 0) {console.log('2344')const token = pageTokens[0]localStorage.setItem('gzm-test-localStorage', 'gzm-localStorage-token')sessionStorage.setItem('gzm-test-sessionStorage', 'gzm-sessionStorage-token')}},submitForm(formName) {this.$refs[formName].validate((valid) => {if (valid) {axios({method: 'post',withCredentials: true, //只要添加withCredentials,請求的接口就報 CORS錯誤,url: 'http://localhost:3000/login',data: this.ruleForm}).then( res => {console.log('login-54-->', res)this.$router.push({path: 'details',})this.$message({showClose: true,message: '登錄成功',type: 'success'});})} else {console.log('error submit!!');return false;}});},resetForm(formName) {this.$refs[formName].resetFields();}}
}
</script><style></style>
vue.config.js 配置
module.exports = {devServer: {host: '0.0.0.0',port: 8080,https: false,open: true,// vue項目啟動時自動打開瀏覽器proxy: {'/api': { // '/api'是代理標識,用于告訴node,url前面是/api的就是使用代理的target: "http://localhost:3000", //目標地址,一般是指后臺服務器地址changeOrigin: true, //是否跨域pathRewrite: { // pathRewrite 的作用是把實際Request Url中的'/api'用""代替'^/api': "" }}}}
}
2、express搭建服務器(端口3000)
const express = require('express');
const fs = require('fs');
const app = express();
const port = 3000;
const path = require('path');// 遇到的問題:1、使用axios請求express接口,code碼返回 CORS 錯誤,服務器接口需要配置請求頭,允許跨域
app.all("*",(req,res,next)=>{console.log('req--->', req.headers)// 遇到的問題:坑1、使用以下請求頭,set-cookie之后,瀏覽器中的cookie中沒有剛剛保存的cookie// 允許任何請求地址訪問// res.setHeader("Access-Control-Allow-Origin", "*")// // 允許任何請求攜帶自定義數據訪問// res.setHeader("Access-Control-Allow-Headers", "*")// 參考地址:https://blog.csdn.net/qq_54074878/article/details/125396455//解決坑 1 問題、res.header("Access-Control-Allow-Origin",req.headers.origin);//允許跨域的域名res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");//允許跨域的請求方法res.header('Access-Control-Allow-Credentials', 'true');//Credentials 證書;憑證;證明;證件;文憑 允許攜帶cookie,設置這個的話上一條的設置不能為'*'res.header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type");//允許的請求頭部next()
})app.post('/login', (req,res) => { const data = fs.readFileSync('./HTTPInterface/login.json')res.setHeader('set-cookie', ['tokenId=FJOSDAFUEWOMRAKEFJSD343242DJOISFJSDFL;path=/;max-age=60;'])// 遇到的問題: 3、返回的數據亂碼,可以添加請求頭res.setHeader('Content-type', 'application/x-www-form-urlencoded')// setTimeout(() => {res.end(data);// },2000)
})app.get('/userInfo', (req,res) => { console.log('res-->', res)const data = fs.readFileSync('./HTTPInterface/userInfo.json')// 遇到的問題: 3、返回的數據亂碼,可以添加請求頭res.setHeader('Content-type', 'application/json')// setTimeout(() => {res.end(data);// },2000)
})app.listen(port,() => {console.log(`Example app listening at http://localhost:${port})`)
})
參考文章:
https://www.freecodecamp.org/chinese/news/everything-you-need-to-know-about-cookies-for-web-development/
參考視頻:
B站終于有人將Session和cookie講明白了!一節(jié)課徹底搞懂
https://www.bilibili.com/video/BV1qu411Z745/?spm_id_from=333.337.search-card.all.click&vd_source=f069debb88bbe421f4c5b68e242f9165
cookie 是什么
Cookie 是一個 HTTP 請求標頭,其中含有先前由服務器通過 Set-Cookie 標頭投放或通過 JavaScript 的 Document.cookie 方法設置,然后存儲到客戶端的 HTTP cookie 。
這個標頭是可選的,而且可能會被忽略,例如在瀏覽器的隱私設置里面設置為禁用 cookie。
為什么項目中要使用cookie,解決了什么問題
http是無狀態(tài)協議,不會保存用戶的登錄信息,例如需求中需要購物,跳轉到購物車/結算頁面,沒有用戶登錄信息,這時候解決方案就是 cookie,瀏覽器登錄之后,服務器接受到,將cookie信息返回,并保存到頁面, 可以設置cookie的有效期
1、cookie 是服務器生成,服務器可通過set-cookie設置cookie,
2、也可以在通過接口返回,比如接口詳情信息中有cookie的標識
3、cookie 需要設置有效期,瀏覽器是否保存cookie是它的事
最后要合理使用cookie
cookie 中遇到哪些問題
問題一:跨域問題, 當本地開發(fā)服務器是http://localhost:8080,
訪問的服務器地址是 http://localhost:300, 端口不同,產生跨域問題,
如何解決:首先頁面接口會報一個錯,參考圖片 CORS.png
解決方案: 在axios中配置參數 withCredentials: true, 然后在 后端配置響應頭 res.header(‘Access-Control-Allow-Credentials’, ‘true’);//Credentials 證書;憑證;證明;證件;文憑
問題二:如何返回json文件內容,
解決:通過fs.readFileSync,獲取到文件
const data = fs.readFileSync(‘./HTTPInterface/login.json’)
問題三:后端使用express,設置set-cookie,注意 max-age=60(單位是秒)
res.setHeader(‘set-cookie’, [‘tokenId=FJOSDAFUEWOMRAKEFJSD343242DJOISFJSDFL;path=/;max-age=60;’])
cookie 中優(yōu)勢是什么
面試題 – 1、跨域請求如何攜帶cookie?
思考:???
參考文章:
https://juejin.cn/post/7066420545327218725
coocie為什么會跨域? 頁面的服務器地址是:localhost:8080, 服務器地址是 localhost:3000, 當使用8080頁面訪問服務器登陸接口,就產生了跨域,此時有兩個解決辦法
參考文章:
https://www.cnblogs.com/imgss/p/cors.html
面試題 – 2、Cookie為什么會越來越大?
思考:???
因為cookie就像一個卡包,可以存放多個cookie,通一個頁面可以創(chuàng)建多個cookie,過期時間跟設置的max-age有關
參考文章
https://juejin.cn/post/6844904113428234247
面試題 – 3、面試:徹底理解Cookie以及Cookie安全
思考:???
參考文章
https://juejin.cn/post/6844904102544031757?searchId=2023101220013497B9D88B9A81E66FAEB1
參考文章:
防止:CSRF攻擊,舉例
遇到哪些問題???
遇到的問題:1、使用axios請求express接口,code碼返回 CORS 錯誤,服務器接口需要配置請求頭,允許跨域
如何解決:首先頁面接口會報一個錯,參考圖片 CORS.png
解決方案: 在axios中配置參數 withCredentials: true, 然后在 后端配置響應頭 res.header(‘Access-Control-Allow-Credentials’, ‘true’);//Credentials 證書;憑證;證明;證件;文憑
遇到的問題:2、javascript模塊中不能直接引入 const axios = require(‘axios’)
因為需要加入webpack模塊化,要不然不認識
避開方案:可以使用 csdn 引入axios
遇到的問題:3、express如何設置 set-cookie
解決方案:
res.setHeader(‘set-cookie’, [‘token=fasdjfla;path=/;max-age=60*1000’])
遇到的問題:4、瀏覽器 http://localhost:8080 ,請求服務器 http://localhost:3000 登錄接口,服務器 set-cookie,在瀏覽器不生效
解決方案:
因為瀏覽器在控制欄勾選了 「停用緩存」,所以導致cookie不會生效。
參考鏈接:https://blog.csdn.net/qq_54074878/article/details/125396455
問題5、設置max-age不生效,注意格式為 max-age,不是maxAge
解決:max-age=12000,直接設置某個值,不要用乘法
12 * 6000,因為請求頭不會識別
問題6、服務器設置set-cookie,設置相同的path,請求頭不會攜帶cookie
解答:瀏覽器不會自己攜帶cookie,需要用特殊的工具,或者前端自己關聯 cookie,使用localstroage存儲,
https://blog.csdn.net/HQqHQhqqhq/article/details/125906604
問題7、Cookie不僅僅有名字和值兩個屬性,還有域(domain),過期時間(expires),路徑(path)等屬性。 其中,不同的域、不同的路徑下可以存在同樣名字的cookie。
https://blog.csdn.net/z591102/article/details/107244500