背景:1、架构是用的是tomcat+nginx,框架是单体的springboot系列;nginx配置了证书,采用https访问

问题:发现用https访问首页之后,验证码加载不出来

解决:经排查发现验证码后台的链接变成了http,提示跨域访问,经百度查询,使用一下方案解决: Nginx SSL 结合Tomcat 重定向URL变成HTTP的问题 - 程序员大本营 (pianshen.com)

我采用的是第一种新增nginx配置,不需要改其它的,这个方案要求访问必须只能https访问,如果访问要求兼容https以及http的可以看一下最终解决方案(未检验)

防止网址内容找不到,把内容复制到下面:

由于要配置服务器(Nginx + Tomcat)的SSL的问题(Nginx同时监听 HTTP HTTPS ),但是,如果用户访问的是 HTTPS 协议,然后Tomcat进行重定向的时候,却变成了 HTTP .

逐步实践过程

在网上找了一些资料,有些是通过修改Nginx配置即可解决,也有只对Tomcat配置进行调整解决的… 各说不一,以下对尝试的解决过程进行记录:

实践一:Nginx新增配置

HTTP协议制转为https

Nginx代理的配置,要添加以下内容:

location / {
    proxy_pass http://test-server;
    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_set_header X-Forwarded-Proto  $scheme;
    # 作用是对发送给客户端的URL进行修改, 将http协议强制转为https
    proxy_redirect   http:// https://;

为了方便测试proxy_redirect强制转换, http(80)、https(443)共存

server {
    listen  80;  
    listen  443 ssl;  

重定向测试

JAVA CODE:

测试结果与重定向一致, 无异常情况;

实际应用场景中,如果要求HTTPHTTPS协议共存的时候(请求的协议与响应的协议一致)就会出现HTTP请求被强转为HTTPS,尝试将Nginx配置proxy_redirect http:// https://;注释,最终使用HTTPS协议亦无法正常跳转;

实践二:Tomcat新增配置

不修改Nginx的情况下, 仅对Tomcat配置进行调整

server.xmlEngine模块下面配置多一个以下的Valve

<Valve className="org.apache.catalina.valves.RemoteIpValve"
proxy_pass http://test-server; 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_set_header X-Forwarded-Proto $scheme;

Tomcat 配置

参看:Tomcat配置

HTTP协议请求

HTTPS协议请求

测试通过,无论使用HTTP访问还是HTTPS访问,最终返回都是根据请求的协议进行响应,问题解决。

  • Nginx
worker_processes  1;
events {
    worker_connections  1024;
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream test-server {  
        server 10.15.16.6:8280 weight=1;
    server {
        listen       80;
        listen       443 ssl;
        server_name  localhost;
        #ssl_certificate      cert.pem;
        #ssl_certificate_key  cert.key;
        ssl_certificate      server.crt;
        ssl_certificate_key  server.key;
       # ssl_session_cache    shared:SSL:1m;
       #ssl_session_timeout  5m;
       # ssl_ciphers  HIGH:!aNULL:!MD5;
       # ssl_prefer_server_ciphers  on;
        location / {
            proxy_pass http://test-server;
            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_set_header X-Forwarded-Proto  $scheme;
            # proxy_redirect   http:// https://;

//处理代码段

domainName = request.getRequestURL().toString();
python 控制小数位数 python控制小数点

一、要求较小的精度将精度高的浮点数转换成精度低的浮点数。1.round()内置方法round()不是简单的四舍五入的处理方式。>>> round(2.5) >>> round(1.5) >>> round(2.675) >>> round(2.675, 2) 2.67round()如果只有一个数作为参数,不指定位数

Java先跟建树 java构建树

构建有序二叉树有两种构建方法:1、按大小顺序构建 2、使用递归构建二叉树和构建链表类似先写一个二叉树的节点类TreeNode类:public class TreeNode { //定义左子节点 public TreeNode leftNode; //定义右子节点 public TreeNode rightNode; //定义节点的权也就是节点的值 public Int

Java kafka offset 调整 kafka java使用

Java版Kafka使用及配置解释一.Java示例kafka是吞吐量巨大的一个消息系统,它是用scala写的,和普通的消息的生产消费还有所不同,写了个demo程序供大家参考。kafka的安装请参考官方文档。引入Maven库首先我们需要新建一个maven项目,然后在pom中引用kafka jar包,引用依赖如下:<dependency> <groupId>or

python3发送邮件1.登录163邮箱(1)前提条件 (2)代码部分# coding:utf-8 import smtplib from email.mime.text import MIMEText from email.header import Header from email.utils import formataddr sender = '12345@163.com' # 邮件