搭建一个前台uniapp,后台springboot的开发环境时,遇到了跨域问题。

console提示错误信息:
Access to XMLHttpRequest at 'http://10.0.180.203/api/cms/getAdList?apId=1' from origin 'http://localhost:8080' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
network查看交互消息出现403错误码:

之前搭建vue开发环境时也遇到过,需要配置代理服务器
代理服务器配置方法如下:
uni-app H5跨域问题解决方案(CORS、Cross-Origin) - DCloud问答
我选择修改manifest.json的方案:
修改时因为出现两个api(代理地址中有一个,baseUrl中也有一个),配好以后如果不通,可以用浏览器打开或者用api测试工具测试代理地址的api接口。
springboot后台服务器请求根地址:http://10.0.180.203/api
webpack-dev-server代理服务器请求根地址:http://localhost:8080/apiproxy
springboot后台服务器请求业务地址:http://10.0.180.203/api/rms/getPositionList?page=1&limit=10&latitude=&longitude=&pcitycode=220100000000
webpack-dev-server代理服务器请求业务地址:
springboot后台服务器业务地址请求截图:
webpack-dev-server代理服务器请求截图

通过测试代理地址的api接口,发现代理地址请求路径中没有“/api”,说明“/api”已经隐藏在代理服务器后面,通过代理地址访问时,不对外显示。
/config/index.config.js配置:

- // config/index.config.js
-
- const CONFIG = {
- //开发环境配置
- development: {
- loginTitleTxt: "欢迎使用人才直聘", // 登录页标题
- copyrightTxt: "人才直聘v1.0", // 版本信息
- assetsPath: "/static/img", // 静态资源路径
- baseUrl: "http://localhost:8080/apiproxy",//"http://10.0.180.203/api", //"http://192.168.0.106:8080/api", "http://localhost:8080/apiproxy"
- // baseUrl: "https://job.qinkonglan.cn/api",
- // baseUrl: "/api",//H5请选用该地址调试
- tokenKey: "WECHAT_TRADE", // 登录标识
- testOpenId: "oEjRxwy7jL9PgG0kWeb4VcDTZEas", // 小程序测试openId
- forcedLogin: false, // touristMode游客模式下APP是否强制用户登录 场景:当用户进入登录页面后无法后退。
- touristMode: true, // APP是否开启游客模式, 游客模式true开启:APP打开后可以进入首页和无权限的页面,游客模式false关闭:APP打开后首先需要登录才能进入, 此时forcedLogin配置项失效。
- },
-
- //生产环境配置
- production: {
- loginTitleTxt: "人才直聘", // 登录页标题
- copyrightTxt: "人才直聘v1.0", // 版本信息
- assetsPath: "/static/img", // 静态资源路径
- // baseUrl: "http://192.168.0.106:8092/api",
- baseUrl: "https://job.qinkonglan.cn/api",
- tokenKey: "WECHAT_TRADE", // 登录标识
- testOpenId: "oEjRxwy7jL9PgG0kWeb4VcDTZEas", // 小程序测试openId
- forcedLogin: false, // touristMode游客模式下APP是否强制用户登录 场景:当用户进入登录页面后无法后退。
- touristMode: true, // APP是否开启游客模式, 游客模式true开启:APP打开后可以进入首页和无权限的页面,游客模式false关闭:APP打开后首先需要登录才能进入, 此时forcedLogin配置项失效。
- }
-
- }
- export default CONFIG[process.env.NODE_ENV];
manifest.json配置

- {
- "name" : "人才直聘",
- "appid" : "",
- "description" : "",
- "versionName" : "1.0.0",
- "versionCode" : "100",
- "transformPx" : false,
- "app-plus" : {
- /* 5+App特有相关 */
- "modules" : {},
- /* 模块配置 */
- "distribute" : {
- /* 应用发布信息 */
- "android" : {
- /* android打包配置 */
- "permissions" : [
- "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
- "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
- "<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>",
- "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
- "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
- "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
- "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
- "<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
- "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
- "<uses-permission android:name=\"android.permission.CAMERA\"/>",
- "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
- "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
- "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
- "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
- "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
- "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
- "<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
- "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
- "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
- "<uses-feature android:name=\"android.hardware.camera\"/>",
- "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
- "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
- ]
- },
- "ios" : {},
- /* ios打包配置 */
- "sdkConfigs" : {},
- "splashscreen" : {
- "ios" : {
- "iphone" : {
- "retina40" : ""
- }
- }
- }
- },
- "splashscreen" : {
- "waiting" : true,
- "alwaysShowBeforeRender" : false,
- "autoclose" : false,
- "delay" : 0
- }
- },
- /* SDK配置 */
- "quickapp" : {},
- /* 快应用特有相关 */
- "mp-weixin" : {
- "appid" : "",
- "setting" : {
- "urlCheck" : true,
- "minified" : false,
- "postcss" : true,
- "es6" : true
- },
- "permission" : {
- "scope.userLocation" : {
- "desc" : "用于设置公司位置信息或者职位工作地点"
- }
- },
- "requiredPrivateInfos" : [ "getLocation", "chooseLocation" ]
- },
- "h5" : {
- "devServer" : {
- "disableHostCheck" : true,
- "proxy" : {
- "/apiproxy" : {
- // "target" : "http://localhost:8099/api/",
- "target" : "http://10.0.180.203/api", //"https://xxxxn/api",
- "changeOrigin" : true,
- "secure" : false,
- "pathRewrite" : {
- "^/apiproxy" : "/"
- }
- },
- "/gaode" : {
- "target" : "https://restapi.amap.com/v3/geocode/regeo",
- "changeOrigin" : true,
- "secure" : false,
- "pathRewrite" : {
- "^/gaode" : "/"
- }
- },
- "/qq" : {
- "target" : "https://apis.map.qq.com/ws/geocoder/v1/",
- "changeOrigin" : true,
- "secure" : false,
- "pathRewrite" : {
- "^/qq" : "/"
- }
- }
- }
- },
- "sdkConfigs" : {
- "maps" : {
- "qqmap" : {
- "key" : "TZCBZ-R333W-T27RS-OX3SB-RRJET-AWFVF"
- }
- }
- }
- }
- }
所以配置在manifest.json中的原服务器地址已经设置/api路径时,在/config/index.config.js中的baseUrl项就不需要再配置/api路径了,只需要配置替代路径"/apiproxy",当然如果替代路径也写为“/api”,配置就像使用外部地址一样,/config/index.config.js中的baseUrl项只修改地址和端口号即可。
错误配置示例
