windows下Nginx+Tomcat部署Vue,解决访问后端api跨域访问错误

windows下Nginx+Tomcat部署Vue,解决访问后端api跨域访问错误

  • vue-vben-admin 项目的一些配置
  • 部署到Tomcat
  • Nginx解决跨域访问错误
  • 致谢

记录一下vue-vben-admin开源项目需要注意的地方,方便以后快速使用。
使用前后端分离方式部署项目。

vue-vben-admin 项目的一些配置

需要重点关注一下几个文件的内容:
系统配置文件:

.env

# 运行端口
VITE_PORT = 3100
# 配置项目名称
VITE_GLOB_APP_TITLE = Vben Admin

开发环境的配置文件 .env.development

# 是否开启mock模式,设置为
VITE_USE_MOCK = false

# 解决开发环境的跨域访问 VITE_USE_MOCK=false 生效
VITE_PROXY=[["/webproject-api","http://192.168.1.109:8081/webproject"]]
# 控制台输出是 "http://192.168.1.109:3100/webproject-api/user/login"
# 但实际请求是 "http://192.168.1.109:8081/webproject/user/login"

# 配合VITE_PROXY使用,自动把/webproject-api拼接到所有的请求前,达到后端请求的转发
VITE_GLOB_API_URL = /webproject-api

生产环境部署配置文件 .env.production

VITE_USE_MOCK = false

# 公共资源路径,可以理解成 项目名 ,必须以/开始结束
VITE_PUBLIC_PATH = /vueproject/

# 后台接口转发 同开发环境
VITE_GLOB_API_URL = /webproject-api

前台ajax请求配置文件(defHttp相关配置): src\utils\http\axios\index.ts

//配置了对后台请求返回的处理方式。 后台返回:{code,result,message}
//默认只返回数据{result}. 若想无处理返回,即返回{code,result,message}
//需要设置  isTransformResponse = false.
transformRequestHook:(){}

// function createAxios() 中只需要关注一个 baseURL 配置,
//这和nginx转发后端请求息息相关。如下端口配置,nginx监听端口也要设置是8888
baseURL:'http://192.168.1.109:8888',

用户登录相关说明:src\api\sys\user.ts

enum Api {
  Login = '/user/login',
}

export function loginApi(params: LoginParams, mode: ErrorMessageMode = 'modal') {
  // 当前直接返回后台返回的result,忽略code,message,
  // isTransformResponse默认为true 仅返回result
  // defHttp.options.requestOptions.isTransformResponse=false
  const response = defHttp.post<LoginResultModel>(
    {
      url: Api.Login,
      // 自动拼接到 VAxios.baseURL + env.development.VITE_GLOB_API_URL 后
      // 即请求URL是:http://192.168.1.109:8888/webproject-api/user/login
      params,
    },
    {
      errorMessageMode: mode,
    },
  );
  // defHttp.options.requestOptions.isTransformResponse=true
  return response
}

到此,针对vue-vben-admin的改造基本完成。然后使用命令 yarn build
等命令执行结束就可在/dist目录下得到,前端生成的静态文件。

部署到Tomcat

因为在生产环境配置文件中 .env.production 中 设置了公共资源名称

 VITE_PUBLIC_PATH = /vueproject/

所以在 Tomcat/webapps/ 下创建同名文件夹 /vueproject,然后将 /dist 目录下的文件拷过去。
然后启动Tomcat。 部署在8080端口。
此时访问 http://localhost:8080/vueproject/ 可正常进入项目的登录页面,则以上内容设置正确。
windows下Nginx+Tomcat部署Vue,解决访问后端api跨域访问错误_第1张图片
但是此时点击登录会发现出现跨域访问错误。
在这里插入图片描述

Nginx解决跨域访问错误

windos解压版 稳定版 nginx 下载
windows下Nginx+Tomcat部署Vue,解决访问后端api跨域访问错误_第2张图片
将其加压到需要安装的位置即可。
最好修改完配置文件后运行。

配置文件修改:conf/nginx.conf
不考虑其他配置可直接将nginx.conf 替换为以下内容:

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    
    keepalive_timeout  65;

	server {
		# nginx监听端口
	    listen       8888;  
	    server_name  localhost;
	
	    # 前台页面地址
	    location /vueproject {
	         proxy_pass         http://192.168.1.109:8080/vueproject/; 
	    }
	
	    # 后端接口代理,用于解决跨域问题
	    location /webproject-api {
	        proxy_set_header Host $host;
	        proxy_set_header X-Real-IP $remote_addr;
	        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	        # 后台接口地址
	        proxy_pass http://192.168.1.109:8081/webproject/;
	        proxy_redirect default;
	        add_header Access-Control-Allow-Origin *;
	        add_header Access-Control-Allow-Headers X-Requested-With;
	        add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
	    }
	}
}

需要注意的地方就是: server 内容里的 listen、location、proxy_pass

listen       8888       	 就是nginx监听的端口此处为8888,

location /vueproject 		 
前台页面转发地址。然后访问前端页面就不用访问     http://localhost:8080/vueproject/
只需访问:http://192.168.1.109:8888/vueproject/ 
							 	
ngnix监听到8888端口,出现访问 /vueproject/**    
然后交付给 location /vueproject 
最终转发到地址:http://192.168.1.109:8080/vueproject/

同时前端发生的api请求都是以  http://192.168.1.109:8888/webproject-api/** 形式进行的
因此会将其转发给  http://192.168.1.109:8081/webproject/  处理

虽然请求看似请求的URL为  http://192.168.1.109:8888/webproject-api/user/login
但是转发后的路径URL为      http://192.168.1.109:8081/webproject/user/login

也可直接双击 nginx.exe。修改完配置文件后,在安装目录打开cmd窗口输入下面代码刷新配置

nginx -s reload

到此成功解决vue部署跨域访问的问题。

致谢

感谢@冷歌提供的参考文章
仔细研究并尝试成功之后,记录出错的原因。
之前只配置了后端api的nginx代理(8888),前端只发布在Tomcat(8080)中,通过地址栏访问代理api测试成功,但是从tomcat中访问仍然是跨域,因为刚接触nginx,完全不懂,所以不知道哪里出的问题。
在朋友的提醒下才知道,8080端口已经被Tomcat占用,即使nginx配置了listen 8080,仍然不起作用,nginx只监听未被占用的端口。

所以需要在nginx中对前端和后端同时进行代理。

你可能感兴趣的:(前端,vue.js)