禁止同域名下的其他页面修改、清除本地存储

当页面跳转到同源的其他页面时,有时会遇到其他页面清空本地存储,导致用户需要重新登录的问题。通过在main.js中添加特定代码,在跳转时锁定local,并仅在用户主动退出时解除锁定,可以避免这种情况。值得注意的是,Storage事件只在非当前页面的本地存储变化时触发,这可能导致在当前页面测试时遇到困扰。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在项目里测试同学提了一个缺陷,就是当前页面跳转到其他同源页面时,由于一些其他原因,被其他页面阻止访问,并触发了其他页面清空本地存储的操作,导致了我们的当前页面也被提回登录页面,需要重新登录的情况。。。。倒腾了一阵子,记录一下备忘

1、main.js页面添加以下代码

// 用来阻止不是自己负责的却是同域名的其他页面清空本地存储local的方法
window.changeLocalStatus = (flag) => { // 设置一个全局的阻止改变local的方法
  window.preventChangeLocal =  (e) => {
    let localValue = localStorage.getItem('xxl_sso_sessionid')
       // 如果sessionId被修改了 或者 local被清空了
      if(localValue !== window.localStorageValue || localStorage.length === 0) {

      localStorage.setItem('xxl_sso_sessionid',window.localStorageValue)
      console.log('重新设置了xxl_sso_sessionid');
    }
  }
  if (flag === 1) {
    window.addEventListener('storage', window.preventChangeLocal)
    console.log('本地存储被锁定了')
  } else {
    window.addEventListener('storage', window.preventChangeLocal)
    console.log('本地存储锁定解除了')
  }
}


// 此方法作废,以上面的为准======================================
window.changeLocalStatus = (flag) => {
function preventChangeLocal (e) {
    if(key !== null) {
      localStorage.setItem(e.key, e.oldValue)
    }
  }
  if (flag) {
    window.addEventListener('storage', preventChangeLocal)
    console.log('本地存储被锁定了')
  } else {
    window.removeEventListener('storage', preventChangeLocal)
    console.log('本地存储锁定解除了')
  }
}

2、当前页面在点击跳转其他页面的方法里锁住local

window.changeLocalStatus(1) // 锁定本地存储

3、只有在用户主动点击退出按钮时,才解除锁定(注意异步的问题) 

    logout () {
      window.localStorageValue = '' // 清除备用的sessionId
      window.changeLocalStatus(0) // 解除本地存储的锁定
      setTimeout(() => {
      this.removeSessionId()
      this.$router.push({
        path: '/login'
      })
      },200)
    }

最后,实在要吐槽一下这个Storage事件,有一个大坑!!

就是监听Storage事件之后,它只有在非当前页面的本地存储改变时才被触发,当前页面无论怎么操作本地存储,都不会触发Storage!

这导致了我在当前页面去测试上面这个监听函数的时候,怎么都不触发,后来看了这个地址的大大写的我才知道还有这一说。。。。。

storage事件中的坑,storage.setItem()无法触发storage事件 - 天兵Q - 博客园

多掉了好几根头发。。。哭唧唧

<think>我们正在处理用户的问题:微信小程序配置服务器域名后如何设置前端Config。用户已经配置了服务器域名(在管理后台设置了request合法域名),现在需要在前端进行相关设置。根据引用[2]的内容,我们了解到在项目开发中经常需要切换的接口地址(本地、测试、正式),因此需要统一配置接口地址,避免在每个页面单独修改。通常,我们会创建一个全局的配置文件(如config.js),然后在需要的地方引入。步骤:1.在项目根目录下创建一个配置文件,例如config.js。2.在该文件中定义基础URL(根据环境,可以手动更改或通过环境变量切换)。3.在需要使用接口的页面或组件中引入该配置文件。注意:由于微信小程序的环境限制,我们能使用process.env这样的Node.js环境变量,但我们可以通过的方式来管理环境(比如设置一个变量来切换环境,或者使用条件编译)。示例代码:创建config.js文件:```javascript//配置环境,可以选择'dev'(开发环境)、'test'(测试环境)、'prod'(生产环境)constenv='dev';//根据环境设置基础URLletbaseUrl='';if(env==='dev'){baseUrl='https://dev.example.com';//开发环境域名,需要与微信后台配置的合法域名一致}elseif(env==='test'){baseUrl='https://test.example.com';//测试环境域名}elseif(env==='prod'){baseUrl='https://api.example.com';//生产环境域名}//导出配置module.exports={baseUrl};```在页面中使用:```javascript//在某个页面的js文件中引入configconstconfig=require('../../config.js');constbaseUrl=config.baseUrl;//发起请求wx.request({url:baseUrl+'/api/user',method:'GET',success(res){console.log(res.data);}});```注意:配置的域名必须已经在微信小程序管理后台的“request合法域名”中设置,且满足引用[1]中的要求(https协议、非IP和localhost、已备案)。另外,引用[4]提到了上传文件,如果涉及文件上传,样需要在上传的域名中配置,并且使用wx.uploadFile方法时也要注意域名配置。优化:为了避免每次切换环境都要手动修改config.js文件,我们可以考虑将环境变量存储在app.js的全局变量中,然后在config.js中根据全局变量来设置。或者,我们可以利用微信小程序的环境(如开发者工具、体验版、正式版)来动态设置,但需要借助微信提供的环境变量(如wx.getAccountInfoSync())来获取当前环境,然后设置对应的baseUrl。例如,使用微信小程序的环境变量(基础库2.2.1以上支持):```javascript//在app.js中App({globalData:{baseUrl:''//在onLaunch中根据环境设置},onLaunch(){//获取账号信息constaccountInfo=wx.getAccountInfoSync();//根据环境设置baseUrlconstenv=accountInfo.miniProgram.envVersion;//返回值:develop(开发版)、trial(体验版)、release(正式版)if(env==='develop'){this.globalData.baseUrl='https://dev.example.com';}elseif(env==='trial'){this.globalData.baseUrl='https://test.example.com';}elseif(env==='release'){this.globalData.baseUrl='https://api.example.com';}}});```然后在页面中,可以通过getApp()来获取baseUrl:```javascriptconstapp=getApp();constbaseUrl=app.globalData.baseUrl;```这种方式更加灵活,无需手动修改配置,自动根据运行环境切换。因此,推荐使用第二种方法(根据运行环境自动设置)。注意事项:微信小程序后台配置的域名必须包含开发、测试、生产环境的所有域名。如果用户需要更详细的步骤,我们可以提供更具体的代码示例。根据用户的问题,我们主要关注前端Config设置方法,以上两种方法都是可行的。相关问题:1.微信小程序如何根据运行环境自动切换请求域名?2.微信小程序配置多个域名时,如何管理?3.微信小程序中如何安全地存储配置信息?</think>在微信小程序中配置服务器域名后,前端需要通过全局配置文件统一管理接口地址。以下是具体设置方法: ### 一、配置步骤 1. **创建全局配置文件** 在项目根目录创建 `config.js` 文件: ```javascript // config.js const ENV = 'prod'; // 环境变量:dev(开发)/test(测试)/prod(生产) const CONFIG = { dev: { baseUrl: "https://dev-api.example.com" // 开发环境地址 }, test: { baseUrl: "https://test-api.example.com" // 测试环境地址 }, prod: { baseUrl: "https://api.example.com" // 生产环境地址(需与后台配置的域名一致) } }; export default CONFIG[ENV]; // 导出当前环境配置 ``` 2. **在接口请求中调用配置** ```javascript // utils/request.js import config from '../config.js'; const request = (url, method, data) => { return new Promise((resolve, reject) => { wx.request({ url: config.baseUrl + url, // 拼接完整接口地址 method: method, data: data, success: (res) => resolve(res.data), fail: (err) => reject(err) }); }); }; ``` 3. **页面中调用接口** ```javascript // pages/index/index.js import request from '../../utils/request.js'; Page({ getData() { request('/user/info', 'GET').then(res => { console.log('用户数据:', res); }); } }); ``` ### 二、关键注意事项 1. **域名合规性**(来自引用[1][^1]): - 必须使用 **HTTPS** 协议 - 禁止使用 IP 地址或 localhost - 域名需完成 **ICP 备案** - 每月最多修改 5 次 2. **服务器配置**(来自引用[3][^3]): - 确保服务器开放必要端口(如 443) - 域名解析到服务器公网 IP - 配置 SSL 证书(HTTPS 必需) 3. **文件上传配置**(来自引用[4][^4]): ```javascript wx.uploadFile({ url: config.baseUrl + '/upload', filePath: tempFilePath, name: 'file' }); ``` ### 三、调试技巧 ```javascript // 开发环境下开启调试 if (ENV === 'dev') { wx.setEnableDebug({ enableDebug: true // 开启vConsole调试 }); } ``` > **配置验证方法**: > 在开发者工具中点击「清缓存」→「清除文件缓存」,确保新配置生效。若出现 `在以下 request 合法域名列表中` 错误,请检查后台域名配置是否与前端的 `config.baseUrl` 完全一致。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值