• HBuilderX修改manifest.json设置,解决跨域问题(CORS、Cross-Origin)


    搭建一个前台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的方案:

    uni-app踩坑+小改造 - 掘金

    修改时因为出现两个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代理服务器请求业务地址:

    http://localhost:8080/apiproxy/rms/getPositionList?page=1&limit=10&latitude=&longitude=&pcitycode=220100000000

     springboot后台服务器业务地址请求截图:

      webpack-dev-server代理服务器请求截图

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

    /config/index.config.js配置:

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

     manifest.json配置

    1. {
    2. "name" : "人才直聘",
    3. "appid" : "",
    4. "description" : "",
    5. "versionName" : "1.0.0",
    6. "versionCode" : "100",
    7. "transformPx" : false,
    8. "app-plus" : {
    9. /* 5+App特有相关 */
    10. "modules" : {},
    11. /* 模块配置 */
    12. "distribute" : {
    13. /* 应用发布信息 */
    14. "android" : {
    15. /* android打包配置 */
    16. "permissions" : [
    17. "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
    18. "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
    19. "<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>",
    20. "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
    21. "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
    22. "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
    23. "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
    24. "<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
    25. "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
    26. "<uses-permission android:name=\"android.permission.CAMERA\"/>",
    27. "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
    28. "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
    29. "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
    30. "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
    31. "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
    32. "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
    33. "<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
    34. "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
    35. "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
    36. "<uses-feature android:name=\"android.hardware.camera\"/>",
    37. "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
    38. "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
    39. ]
    40. },
    41. "ios" : {},
    42. /* ios打包配置 */
    43. "sdkConfigs" : {},
    44. "splashscreen" : {
    45. "ios" : {
    46. "iphone" : {
    47. "retina40" : ""
    48. }
    49. }
    50. }
    51. },
    52. "splashscreen" : {
    53. "waiting" : true,
    54. "alwaysShowBeforeRender" : false,
    55. "autoclose" : false,
    56. "delay" : 0
    57. }
    58. },
    59. /* SDK配置 */
    60. "quickapp" : {},
    61. /* 快应用特有相关 */
    62. "mp-weixin" : {
    63. "appid" : "",
    64. "setting" : {
    65. "urlCheck" : true,
    66. "minified" : false,
    67. "postcss" : true,
    68. "es6" : true
    69. },
    70. "permission" : {
    71. "scope.userLocation" : {
    72. "desc" : "用于设置公司位置信息或者职位工作地点"
    73. }
    74. },
    75. "requiredPrivateInfos" : [ "getLocation", "chooseLocation" ]
    76. },
    77. "h5" : {
    78. "devServer" : {
    79. "disableHostCheck" : true,
    80. "proxy" : {
    81. "/apiproxy" : {
    82. // "target" : "http://localhost:8099/api/",
    83. "target" : "http://10.0.180.203/api", //"https://xxxxn/api",
    84. "changeOrigin" : true,
    85. "secure" : false,
    86. "pathRewrite" : {
    87. "^/apiproxy" : "/"
    88. }
    89. },
    90. "/gaode" : {
    91. "target" : "https://restapi.amap.com/v3/geocode/regeo",
    92. "changeOrigin" : true,
    93. "secure" : false,
    94. "pathRewrite" : {
    95. "^/gaode" : "/"
    96. }
    97. },
    98. "/qq" : {
    99. "target" : "https://apis.map.qq.com/ws/geocoder/v1/",
    100. "changeOrigin" : true,
    101. "secure" : false,
    102. "pathRewrite" : {
    103. "^/qq" : "/"
    104. }
    105. }
    106. }
    107. },
    108. "sdkConfigs" : {
    109. "maps" : {
    110. "qqmap" : {
    111. "key" : "TZCBZ-R333W-T27RS-OX3SB-RRJET-AWFVF"
    112. }
    113. }
    114. }
    115. }
    116. }

    所以配置在manifest.json中的原服务器地址已经设置/api路径时,在/config/index.config.js中的baseUrl项就不需要再配置/api路径了,只需要配置替代路径"/apiproxy",当然如果替代路径也写为“/api”,配置就像使用外部地址一样,/config/index.config.js中的baseUrl项只修改地址和端口号即可。

    错误配置示例

  • 相关阅读:
    【容器】docker基础使用
    C++语言整理(待更新)
    windows下go的相关玩法
    ubuntu18/20 下如何生成core文件
    网络安全基础(一)网安考证必备知识:防火墙隧道的类型,防火墙隧道技术,密码学,常见的对称加密算法和非对称加密算法
    _c++11( lambda)
    C++:类与对象(上)
    Java项目:JSP二手自行车在线销售商城平台系统
    解析java中的StringBuffer和StringBuilder
    好代码资源网同款主题,基于ripro9.0定制开发,包含演示数据
  • 原文地址:https://blog.csdn.net/qq_27361945/article/details/132582024