vue 关于 axios cors token验证的坑

最近做了项目迁移,由于之前的版本不是本人开发,在接口调用的时候接二连三地报403,要不就是200没有response。经过代码细读,发现这个项目除了登录,其余的接口统统需要使用token,这里就用到了请求拦截器向header中添加x-access-token和响应拦截器,请求之前由于后端没处理跨域的Access-Control-Allow-Origin: *,前端接到之后浏览器就报错没有返回数据,这里需要jsonp跨域(参考creat方法),然后项目中有的地方需要调用公用接口比如高德的接口,不能用jsonp跨域,说白了就是header中不能有乱七八糟的东西,只能正常调用,接口axios需要重新配置(参考creatNormal),配置完之后响应拦截器的配置也需要改变,因为数据返回的格式也和内部接口不同,内部接口有res.code,外部接口没有,参考响应拦截器中
if(!data.code){
return data
}
还有 Axios.defaults.withCredentials = false;这个事,刚开始被接口整的头晕目眩在网上看有人说传token的时候,值必须是true.我就加上了,结果还是什么都不返回,我去掉之后反而好用了,后来在思否看见下面这段话

withCredentials的情况下,后端要设置Access-Control-Allow-Origin为你的源地址,例如http://localhost:8080,不能是*,而且还要设置header(‘Access-Control-Allow-Credentials: true’);

我的项目后端设置的是*,没办法了,只能jsonp跨域了

下面上代码,有何高见求指教,省一行代码是一行

import Axios from ‘axios’
import util from ‘@/common/util.js’
// Axios.defaults.withCredentials = true;
class httpRequest {
constructor () {
this.options = {
method: ‘’,
url: ‘’
}
// 存储请求队列
this.queue = {}
}

// 销毁请求实例
destroy (url) {
delete this.queue[url]
const queue = Object.keys(this.queue)
return queue.length
}

// 请求拦截
interceptors (instance, url) {
// 添加请求拦截器
instance.interceptors.request.use(config => {
if (!config.url.includes(‘api/login’) && !config.url.includes(‘restapi’)) {
config.headers[‘x-access-token’] = util.getCookie(‘loginToken’)
}
// Spin.show()
// 在发送请求之前做些什么
return config
}, error => {
// 对请求错误做些什么
return Promise.reject(error)
})
// 添加响应拦截器
instance.interceptors.response.use((res) => {
const { data } = res
if(!data.code){
return data
}
if (!(data instanceof Blob)) {
if (data.code !== 200) {
// 后端服务在个别情况下回报201,待确认
if (data.code === 401 ) {
util.deleteCookie(‘loginToken’)
window.location.href = ‘/’
}
if (data.code === 202) {
this.KaTeX parse error: Expected 'EOF', got '}' at position 36: …ata) }̲ retu…message.error(‘服务内部错误’)
// 对响应错误做点什么
return Promise.reject(error)
})
}

// 创建实例
create () {
const conf = {
baseURL: ‘’,
headers: {
Accept: ‘application/json, text/plain’,
‘Content-Type’: ‘application/json; charset=utf-8’,
‘X-URL-PATH’: location.pathname
}
}
// Axios.defaults.withCredentials=true
return Axios.create(conf)
}

// 创建正常实例
createNormal () {
const conf = {
baseURL: ‘’,
headers: {
‘Content-Type’: ‘application/x-www-form-urlencoded’,
}
}
// Axios.defaults.withCredentials=true
return Axios.create(conf)
}

// 传token请求实例
request (options) {
var instance = this.create()
this.interceptors(instance, options.url)
options = Object.assign({}, options)
this.queue[options.url] = instance
return instance(options)
}
// 正常请求实例
requestNormal (options) {
var instance = this.createNormal()
this.interceptors(instance, options.url)
options = Object.assign({}, options)
this.queue[options.url] = instance
return instance(options)
}
}
export default httpRequest

Vue.js 是一个流行的 JavaScript 应用程序框架,用于构建单页面应用程序(SPA)。Axios 是一个基于 Promise 的 HTTP 库,用于在 Web 应用程序中发送异步请求。 在 Vue 应用程序中,可以使用 Axios 发送 HTTP 请求来与后端服务器进行通信。以下是一个简单的示例,展示了如何使用 Axios 来发送登录请求并处理响应: ``` // 在 Vue 组件中引入 Axios import axios from 'axios'; // 定义一个名为 Login 的 Vue 组件 export default { data() { return { email: '', password: '' } }, methods: { login() { // 使用 Axios 发送 POST 请求 axios.post('/api/login', { email: this.email, password: this.password }) .then(response => { // 处理成功响应 console.log(response.data); }) .catch(error => { // 处理错误响应 console.log(error.response.data); }); } } } ``` 在后端服务器中,你可以使用一些框架来处理登录和注册请求。以下是一个使用 Node.js 和 Express 框架的示例: ``` // 引入 Express 框架和相关中间件 const express = require('express'); const bodyParser = require('body-parser'); const cors = require('cors'); // 初始化 Express 应用程序 const app = express(); // 解析请求体中的 JSON 数据 app.use(bodyParser.json()); // 允许跨域请求 app.use(cors()); // 处理登录请求 app.post('/api/login', (req, res) => { const email = req.body.email; const password = req.body.password; // 在数据库中查找用户信息 // ... // 验证用户信息 if (email === 'example@example.com' && password === 'password') { // 登录成功,返回用户信息和一个 JWT 令牌 const user = { id: 1, email: 'example@example.com' }; const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'; res.json({ user, token }); } else { // 登录失败,返回错误信息 res.status(401).json({ error: 'Invalid email or password.' }); } }); // 处理注册请求 app.post('/api/register', (req, res) => { const email = req.body.email; const password = req.body.password; // 在数据库中创建用户信息 // ... // 返回成功响应 res.json({ message: 'Registration successful.' }); }); // 启动服务器,监听端口 const port = process.env.PORT || 3000; app.listen(port, () => { console.log(`Server started on port ${port}.`); }); ``` 注意,这只是一个简单的示例。在实际应用程序中,你需要处理更多的情况和错误,例如用户输入错误的凭据、数据库连接错误等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值