通过https协议访问Tomcat部署并使用Shiro认证的应用跳转登到录页时协议变为http的问题

news2025/1/16 20:15:02

问题描述:
       在最近的一个项目中,有一个存在较久,并且只在内部城域网可访问的一个使用Shiro框架进行安全管理的Java应用,该应用部署在Tomcat服务器上。起初,应用程序可以通过HTTP协议访问,一切运行都没问题。然而,当我们决定切换到HTTPS协议以增强客户端(通常是网络浏览器)与服务器之间的安全通信时,问题随之产生,主要问题现象如下:

        例如登录页面的URL是https://***/login,任何尝试访问受Shiro保护的页面的操作都应该重定向用户到这个登录页面。但问题在于,即使在启用HTTPS协议并尝试使用HTTPS协议访问这些受保护的页面,系统仍然不断地将浏览器重定向到http://***/login,这就启用HTTPS协议后遇到的主要问题。

        我们部署架构中一个值得注意的方面是,网络前端有一个物理负载均衡器,负责处理SSL认证。通过HTTPS协议发出的请求首先到达这个负载均衡器,然后再通过HTTP协议转发到Tomcat Web服务器,结构如下图,其中响应中的Location Header在用户使用https访问页面时,预期应该返回https://***/login,但实际却返回了http://***/login

问题解决:
        想了下,问题应该就是因为负载卸载了证书实际到达Tomcat的请求协议是HTTP的,导致Shiro识别到的请求协议是HTTP,所以跳转地址便使用了HTTP而不是实际的HTTPS。

        先是查了下资料,定位到Shiro会根据一个Header名字为X-Forwarded-Proto(值是https或http)来获取通过反向代理进来的请求的实际使用协议(因为大多数SSL证书处理都是在反向代理上卸载掉, 倒是到达应用时的请求都是HTTP)。同时Tomcat的server.xml需要增加配置来识别这个Header用来初始化HttpServletRequest内的属性, 实际影响的就是request.getScheme()这个方法的返回值。 

具体修改步骤:

  • 第一步:修改反向代理配置增加X-Forwarded-Proto Header

如果是硬负载比如A10或者F5,例如针对https协议需要配置如下 ,一般针对https和http协议会建立两个模板分别处理443端口和80端口的请求。

       
如果是Nginx,是下面这样配置:

  • 第二步:修改Tomcat配置

在Tomcat的server.xml配置文件中<Engine><Host>标签下增加如下配置,其中remoteIpHeader这个是用于获取外部实际ip的,一般一并加上了。protocolHeaderHttpsValue也可以不加因为https是默认值,加上这个一般一般情况下Java代码通过request.getScheme()方法就可以获取用户请求实际使用的协议了,Shiro也就可以根据实际协议去拼装登录页面URL了。

<Valve className="org.apache.catalina.valves.RemoteIpValve"
       remoteIpHeader="x-forwarded-for"
       protocolHeader="x-forwarded-proto"
       protocolHeaderHttpsValue="https" />
  • 第三步: Tomcat额外配置(可选)

我这里配置了以上两步以后,后端request.getScheme()方法仍然获取的是http,因为知道scheme这个值是RemoteIpValve这个类处理的,就看了下代码,发现server.xml中关于RemoteIpValve还有一个配置项,叫internalProxies是一个关于ip的正则表达式,代码中有一个if条件,只有当反向代理的ip可以通过正则匹配成功才会处理x-forwarded-*的header。并且Tomcat 7中正则缺少172段ip,更新版本的Tomcat可以匹配10.x.x.x, 192.168.x.x, 169.254.x.x, 127.x.x.x, 和172.16.x.x 到 172.31.x.x。 所以当反向代理服务器或者设备的ip不在以上范围的时候需要主动在RemoteIpValve配置中增加internalProxies的配置,如下(这里是Tomcat 7所以需要手动处理172段ip):

<Valve className="org.apache.catalina.valves.RemoteIpValve"
       internalProxies="172\.31\.1\.22"
       remoteIpHeader="x-forwarded-for"
       protocolHeader="x-forwarded-proto"
       protocolHeaderHttpsValue="https" />

总结

成功修改以上配置后,Shiro可以正常通过request.getScheme()获取用户请求使用的实际协议,也就解决了用户通过https访问页面但是跳转登录页面时协议变成了http的问题。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1324304.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

海外代理IP如何选择?如何避开误区?

近年来&#xff0c;我国互联网商业保持持续发展的状态大环境的优化&#xff0c;大大小小的企业都想乘胜追击&#xff0c;大展宏图&#xff0c;积极推动各项数据业务的进程。 而对于跨境业务来说&#xff0c;代理IP是不可或缺的重要工具之一&#xff0c;市面上代理IP类型众多&a…

基于k6和python进行自动化性能测试

摘要&#xff1a;在性能测试中&#xff0c;达到相应的性能指标对于一个软件来说十分重要&#xff0c;在本文中&#xff0c;将介绍一种现代化性能测试工具k6。 import http from k6/http; import { sleep } from k6; export default function () {http.get(https://test-api.co…

Java对接腾讯多人音视频房间示例

最近在对接腾讯的多人音视频房间&#xff0c;做一个类似于腾讯会议的工具&#xff0c;至于为什么不直接用腾讯会议&#xff0c;这个我也不知道&#xff0c;当然我也不敢问 首先是腾讯官方的文档地址&#xff1a;https://cloud.tencent.com/document/product/1690 我是后端所以…

大一C语言查缺补漏1 12.2

学习方向非C语言方向&#xff0c;但是专业是。。 仅供参考&#xff0c;&#xff0c;祝大家期末考试顺利。 对于二维数组定义&#xff0c;要给出明确的定义 eg&#xff1a;double a [21][4] int a [ ][3] {1,2,3,4,5,6} 不可以是&#xff1a;int a [ ][3]&#xff1b; 在c…

SpringBlade export-user SQL 注入漏洞复现

0x01 产品简介 SpringBlade 是一个由商业级项目升级优化而来的 SpringCloud 分布式微服务架构、SpringBoot 单体式微服务架构并存的综合型项目。 0x02 漏洞概述 SpringBlade v3.2.0 及之前版本框架后台 export-user 路径存在安全漏洞,攻击者利用该漏洞可通过组件customSqlS…

Flutter实现丝滑的滑动删除、移动排序等-Dismissible控件详解

文章目录 Dismissible 简介使用场景常用属性基本用法举例注意事项 Dismissible 简介 Dismissible 是 Flutter 中用于实现可滑动删除或拖拽操作的一个有用的小部件。主要用于在用户对列表项或任何其他可滑动的元素执行删除或拖动操作时&#xff0c;提供一种简便的实现方式。 使…

sed 命令详解

1. 强大的编辑工具 sed是一个“作交互式的”面向字符流的编辑器。输入一般来自文件&#xff0c;但是也可以直接来自键盘。输出在默认情况下输出到终端屏幕上&#xff0c;但是也可以输出到文件中&#xff0c;sed通过解释脚本来工作&#xff0c;该脚本指定了将要执行的动作。 s…

【java】java学习笔记

1. 快速入门 // Hello类 public class Hello {// main方法public static void main(String[] args) {System.out.println("hello world!");} } 在控制台输入以下命令&#xff0c;对.java文件&#xff08;源文件&#xff09;进行编译操作&#xff0c;生成Hello.clas…

Azure Machine Learning - 提示工程高级技术

本指南将指导你提示设计和提示工程方面的一些高级技术。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本复旦硕&#xff0c;复旦机器人智能实验室成员&#xff0c;阿里云认证的资深架构师&#xff0c…

探索 MajicStudio:一款多功能视频编辑软件

一、产品简介 MajicStudio是一款基于人工智能的图片编辑与设计工具&#xff0c;拥有简洁的界面与丰富功能。采用深度学习和计算机视觉技术可以自动识别图片要素。 二、应用场景 MajicStudio的AI图像功能适用于多场景&#xff0c;包括艺术设计、电商、游戏和文创等场景。 三、…

Vim:文本编辑的强大利器

Vim&#xff1a;文本编辑的强大利器 概述1. 工作模式1.1 普通模式1.2 插入模式1.3 可视模式 2. 代码示例2.1 移动光标2.2 复制和粘贴2.3 查找和替换 3. 应用场景结语 概述 Vim&#xff08;Vi Improved&#xff09;是一款强大的文本编辑器&#xff0c;广泛应用于Linux和Unix系统…

python线程中的semaphore信号量是什么

python中的线程之semaphore信号量 semaphore是一个内置的计数器&#xff0c;每当调用acquire()时&#xff0c;内置计数器-1&#xff1b;每当调用release()时&#xff0c;内置计数器1。 计数器不能小于0&#xff0c;当计数器为0时&#xff0c;acquire()将阻塞线程直到其他线程…

【lesson16】MySQL表的基本操作update(更新)和delete(删除)

文章目录 表的基本操作介绍update建表测试 delete建表测试 表的基本操作介绍 CRUD : Create(创建), Retrieve(读取)&#xff0c;Update(更新)&#xff0c;Delete&#xff08;删除&#xff09; update 建表 这里就不建表了&#xff0c;因为之前就建过了&#xff0c;这里给大家…

求奇数的和 C语言xdoj147

题目描述&#xff1a;计算给定一组整数中奇数的和&#xff0c;直到遇到0时结束。 输入格式&#xff1a;共一行&#xff0c;输入一组整数&#xff0c;以空格分隔 输出格式&#xff1a;输出一个整数 示例&#xff1a; 输入&#xff1a;1 2 3 4 5 0 6 7 输出&#xff1a;9 #inclu…

drf知识--02

APIView执行流程分析 源码分析&#xff1a; # 1 在路由中&#xff1a;path(books/, views.BookView.as_view()),请求来了 # 2 先看 as_view()---->APIView的 as_view---》as_view执行结果跟之前一样&#xff0c;去除了csrf认证classmethoddef as_view(cls, **initkwargs):vi…

青少年CTF-qsnctf-Web-PingMe02

题目环境&#xff1a; 题目难度&#xff1a;★ 题目描述&#xff1a;诶&#xff1f;又是一道Ping题目诶&#xff01; 给了一个ip参数 传参&#xff1a; ?ip1.1.1.1 有回显结果 使用英文分号";"进行连接后续命令 列出此路径下的目录和文件 ?ip1.1.1.1;ls 列出根目录…

vue3表格导入导出.xlsx

在这次使用时恰好整出来了&#xff0c;希望大家也能学习到&#xff0c;特此分享出来 使用前确保安装以下模块&#xff0c;最好全局配置element-plus ### 展示一下 ### ###导出选项 ### ###导入de数据 ### 安装的模块 npm install js-table2excel // 安装js-table2excel n…

链表相关题目(数据结构期末复习)

题目要求 下面算法 FB1 将一个带头节点的单链表LA 分解为两个具有相同结构的单链表 LB&#xff0c;LC&#xff0c; 其中LB中节点为LA中值小于0的节点&#xff0c;而LC中节点为LA中值大于或等于0的节点。请在空白处填上合理的语句。 翻译&#xff1a;LA 初始链表&#xff1b;L…

Python图像文字识别详解,实战代码

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在现代计算机视觉和图像处理应用中&#xff0c;文字识别是一个重要的任务。本篇博客将详细介绍如何使用Python中的文字识别库&#xff0c;以及一些优秀的开源工具&#xff0c;来实现对图片中文字的准确识别。通过…

从学到考,一图带你读懂开发者技能成长秘籍

亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术&#xff0c;观点&#xff0c;和项目&#xff0c;并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏…