前情提要

nginx开启SSL模块教程:Nginx安装SSL证书前需要开启SSL模块

nginx安装SSL证书教程:腾讯云Nginx服务器SSL证书安装部署

一、tomcat没有安装SSL证书,但是想通过Https协议访问tomcat

此处使用的就是nginx的反向代理,本质上我们访问tomcat还是使用http协议,但我们通过nginx的反向代理,会先通过Https协议访问nginx,然后再通过nginx将Https请求转发为http请求发送给tomcat服务器。相当于加了一层请求转发,这也让我们可以不在tomcat上安装ssl证书就可以通过https协议访问tomcat。多集群下,nginx也支持负载均衡,所以我们通常是在nginx上安装SSL证书。

反向代理看着复杂,但其实只需要在nginx.conf上配置以下,具体看以下配置:

假定你的服务器地址为127.0.0.1;看到127.0.0.1就填你自己服务器的ip地址,看到8080就填你tomcat服务器的端口号。

【地理路径地址】:例如你想让 https://127.0.0.1/test 这个路径代理tomcat服务器,那么此处就填写/test。

【tomcat项目地址】:首先你要确定你所要代理的tomcat项目,然后在此处填写 https://127.0.0.1:8080/项目名 

server {
    。。。。。。。
    
    location [代理路径地址] {
            proxy_pass [tomcat项目地址];
            proxy_http_version 1.1;
            proxy_set_header  X-Forwarded-Proto https; #配置报文转发协议为https
            proxy_set_header  X-Real-IP  $remote_addr;
            proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header  Host $http_host;
            proxy_set_header Cookie $http_cookie;
            proxy_connect_timeout 30; 
            proxy_set_header Referer $http_referer;
            proxy_cookie_path [/项目名] [代理路径地址]; #保证https和http的cookie一致
        }
}

proxy_cookie_path介绍:proxy_cookie_path详细介绍

二、nginx安装SSL证书后,反向代理https请求不携带cookie的问题

首先这个问题,有好几个方面的影响,其中一个环节出问题,就都会出问题,所以请耐心看下去,我会尽量讲清楚。

1.nginx安装SSL证书后,其中的项目如果ajax或axios发送http请求会出现(已屏蔽:mixed-content)的情况,F12控制台会显示

解决办法:通过nginx反向代理tomcat,使所有请求都变成https请求,就不会出现此错误。

2.反向代理配置问题

如果你是按照我上面的反向代理的配置,那就不会出现问题,主要是要配置

proxy_set_header Cookie $http_cookie; 

 proxy_cookie_path [/项目名] [代理路径地址]; #保证https和http的cookie一致

这两项。

3.例:前后端分离,前端Vue,后端SSM(所以推荐前后端分离项目使用token)

Vue中axios是默认不带cookie的,所以要在main.js中添加代码如下:

import axios from 'axios';#如果有就不要加了
axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded';
axios.defaults.withCredentials = true;

后端SSM中,我们要配置允许跨域,此处会有一点坑(本菜逼改了一天才找到)

首先,可以看一下这篇文章:前后端分离中本地调试和部署远端Cookie的不同

看完上面这一篇文章,就会明白,本地调试为什么没有cookie。

然后,我们在后端配置允许跨域时(SSM,Spring Boot本质一样都是Spring MVC)

通常会将'Access-Control-Allow-Origin' = "*",这样在同ip同协议下是可以的,但在Https、http请求转换下,我们就需要将'Access-Control-Allow-Origin' 设置为我们axios所请求的协议加ip,如我的axios请求为https://127.0.0.1/test,那么'Access-Control-Allow-Origin'就要设置为"https://127.0.0.1"。在SSM中的MVC.xml配置如下:

<!--前后端分离,允许跨域-->
    <!--  重中之重,反复观看  -->
    <mvc:cors>
        <mvc:mapping path="/**"
                     allowed-origins="axios所请求的协议加ip"
                     allowed-methods="POST, GET, OPTIONS, DELETE, PUT"
                     allowed-headers="Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"
                     allow-credentials="true" />
    </mvc:cors>
Logo

前往低代码交流专区

更多推荐