前后端分离常用配置(Spring Boot + Vue)

前后端分离

1、解决跨域问题

1.1 、后端配置

1.1.1、 配置类

@Override
public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/**") // 任意路径
        .allowedOrigins("*")  //允许所有域
        .allowedMethods("GET","HEAD","PUT","DELETE") //允许的方法
        .allowCredentials(true)  
        .maxAge(3600)
        .allowedHeaders("*"); //允许跨的域
}

1.1.2、注解

 @CrossOrigin("*")

2、前端处理

vue工程中创建vue.config.js文件

/**
 * 请求代理对象,解决跨域问题
 * 拦截http请求
 * target:拦截目标地址
 * pathRewrite:拦截的地址是否修改
 * **/
let proxyObj = {};
proxyObj['/']={
    ws:false,
    target:'http://localhost:80',
    changeOrigin:true,
    pathRewrite:{
        '^/':''
    }
}

module.exports={
    //生产服务器
    devServer:{
        host:'localhost',
        port:8080,
        //代理对象
        proxy:proxyObj
    }
}

2、前端处理

2.1、axios处理

首先安装axios

npm install axios
2.1.1、局部配置
import Axios from 'axios'
Axios.get('http://localhost:8081/blogs/'+(currentPage)+'/3').then(function (data) {
    ......
});
2.1.2、全局配置

配置一

import axios from 'axios';
Vue.prototype.axios = axios;

this.axios.get('http://localhost:8081/blogs/'+this.id).then(function (resp) {
    ......
});

配置二

import axios from 'axios';
Vue.prototype.$axios = axios;
//全局配置
axios.defaults.baseURL='http://localhost:8081/'
axios.defaults.headers.common['Authorization']  = 'Token '
axios.defaults.headers.post['Content-type'] = 'application/urlencode'
axios.defaults.headers.get['Accepts'] = 'application/json'

//使用
_this.$axios.get('/blogs/'+(currentPage)+'/3').then(function (data) {
    ......
});

2.2、 封装axios方法

2.2.1 key/value形式
import axios from "axios";

/**
 * 封装post请求
 * */
let base= '';
export const  postRequest = (url,params)=>{
    return axios({
        method:'post',
        url:`${base}${url}`,
        data:params,//对象key/value
        transformRequest: [function (params) {
            let ret = '';
            for (let item in params){
                //encodeURIComponent()函数可把字符串作为URI组件进行编码
                ret += encodeURIComponent(item)+'='+encodeURIComponent(params[item])+'&';
            }
            return ret;
        }],
        headers:{
            'Content-Type':'application/x-www-form-urlencoded',
        }
    });
}

/**
 * 封装put请求
 * */
export const putRequest = (url,params)=>{
    return axios({
        method:'put',
        url:`${base}${url}`,
        data:params,//对象key/value
        transformRequest: [function (params) {
            let ret = '';
            for (let item in params){
                //encodeURIComponent()函数可把字符串作为URI组件进行编码
                ret += encodeURIComponent(item)+'='+encodeURIComponent(params[item])+'&';
            }
            return ret;
        }],
        headers:{
            'Content-Type':'application/x-www-form-urlencoded',
        }
    });
}

/**
 * 封装delete请求
 * */
export const deleteRequest = (url)=>{
    return axios({
        method:'delete',
        url:`${base}${url}`,
    });
}

/**
 * 封装delete请求
 * */
export const deleteRequest = (url,params)=>{
    return axios({
        method:'delete',
        url:`${base}${url}`,
        data:params,//对象key/value
        transformRequest: [function (params) {
            let ret = '';
            for (let item in params){
                //encodeURIComponent()函数可把字符串作为URI组件进行编码
                ret += encodeURIComponent(item)+'='+encodeURIComponent(params[item])+'&';
            }
            return ret;
        }],
        headers:{
            'Content-Type':'application/x-www-form-urlencoded',
        }
    });
}
2.2.2 JSON形式
//.js文件引入方式
import { Message } from 'element-ui';
import axios from 'axios'
import router from '../router'

/**封装响应
 * 响应的拦截器
 * success回调
 * error回调
 * 失败的情况:
 * 1.业务的失败。如删除失败,服务端的响应还是200,进入success
 * 2.服务端的异常信息,进入error,请求一定失败
 * **/
axios.interceptors.response.use(success=>{
    console.log(success);
    /**
     * success.data.status 返回的json
     * 业务错误
     * axios的resp返回空,直接判断是否为空,没有则请求失败
     * **/
    if (success.status && success.status ==200 && success.data.status==500){
        Message.error({message:success.data.msg})
        return;
    }
    /**
     * 输出服务端返回的消息
     * **/
    if (success.data.msg){
        Message.success({message:success.data.msg});
    }
    /**
     * 返回json
     * 返回到axios请求调用中
     *
     * **/
    return success.data;

},error=>{     //一定失败
    if (error.response.status == 504 || error.response.status == 404){
        Message.error({message:'服务器被吃( ╯□╰ )了'})
    }else if (error.response.status == 403){
        Message.error({message:'权限不足,请联系管理员'})
    }else if (error.response.status == 401){
        Message.error({message:'账户已过期,请重新登陆'})
        //返回到登录界面
        router.replace("/")
    }else {
        if (error.response.data.msg){
            Message.error({message:error.response.data.msg})
        } else{
            Message.error({message:'未知错误'})
        }
    }
    return;
})


/**
 * 定义请求
 * base 可以统一加前缀
 * transformRequest
 * **/
let base = '';
export const postKeyValueRequest=(url,params)=>{
    return axios({
        method:'post',
        url:`${base}${url}`,    //`` 字符串拼接
        data:params,
        transformRequest:[function (data) {
            let ret = '';
            for (let i in data) {
                //key->value加&
                ret+=encodeURIComponent(i)+'='+encodeURIComponent(data[i])+'&'
            }
            //console.log(ret)
            return ret;
        }],
        headers:{
            'Content-Type':'application/x-www-form-urlencoded'
        }
    })
}

/**
 * GET
 * POST 传递JSON
 * PUT	传递JSON
 * DELETE 请求
 * **/

export const postRequest=(url,params)=>{
    return axios({
        method:'post',
        url:`${base}${url}`,
        data:params,
    })
}

export const putRequest=(url,params)=>{
    return axios({
        method:'put',
        url:`${base}${url}`,
        data:params,
    })
}

export const getRequest=(url,params)=>{
    return axios({
        method:'get',
        url:`${base}${url}`,
        data:params,
    })
}

export const deleteRequest=(url,params)=>{
    return axios({
        method:'delete',
        url:`${base}${url}`,
        data:params,
    })
}

2.3、axios过滤器

//.js文件引入方式
import { Message } from 'element-ui';
import axios from 'axios'
import router from '../router'

/**封装响应
 * 响应的拦截器
 * success回调
 * error回调
 * 失败的情况:
 * 1.业务的失败。如删除失败,服务端的响应还是200,进入success
 * 2.服务端的异常信息,进入error,请求一定失败
 * **/
axios.interceptors.response.use(success=>{
    console.log(success);
    /**
     * success.data.status 返回的json
     * 业务错误
     * axios的resp返回空,直接判断是否为空,没有则请求失败
     * **/
    if (success.status && success.status ==200 && success.data.status==500){
        Message.error({message:success.data.msg})
        return;
    }
    /**
     * 输出服务端返回的消息
     * **/
    if (success.data.msg){
        Message.success({message:success.data.msg});
    }
    /**
     * 返回json
     * 返回到axios请求调用中
     *
     * **/
    return success.data;

},error=>{     //一定失败
    if (error.response.status == 504 || error.response.status == 404){
        Message.error({message:'服务器被吃( ╯□╰ )了'})
    }else if (error.response.status == 403){
        Message.error({message:'权限不足,请联系管理员'})
    }else if (error.response.status == 401){
        Message.error({message:'账户已过期,请重新登陆'})
        //返回到登录界面
        router.replace("/")
    }else {
        if (error.response.data.msg){
            Message.error({message:error.response.data.msg})
        } else{
            Message.error({message:'未知错误'})
        }
    }
    return;
})

2.4 、ES6新特性

1.5以前

const _this = this;
_this.$axios.get('/blogs/'+(currentPage)+'/3').then(function (data) {
	_this......
});

新特性

  this.$axios.delete('http://localhost:8081/blogs/'+_this.id).then(resp=>{
  	this.....
  });

2.5、element UI

安装

import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI);

导入提示框

import {Message} from "element-ui";
Message({
    message: '删除博客成功',
    type: 'success'
});


2.6 字符串拼接

let ids = '?';
//拼接字符
this.multipleSelection.forEach(item => {
    ids += 'ids=' + item.id + '&';
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值