[JavaEE]记录一下反向代理下SSO不能正常使用的一个坑

嗯...真的是很久没更新了,感觉有点瓶颈了,学又学不下去,工作要用的东西又没有难度,跳槽又没经验没学历关键是还不会吹也是尴尬...

无意间翻到这个博客,又是好久不更新突然想到了还有这个东西,就发一个最近做的小工具好了

主要是在做的某系统,客户哪里不愿意提供多端口,但是要部署多个应用和单点登录,于是就理所当然的用上了反向代理,然后就被公司内部的sso客户端给坑了...

SSO单点登陆一般思路应该是这样:

重定向到单点登录服务器 -> 服务器登陆成功跳回并带上身份标识 -> 项目二次前往单点登陆服务器校验身份并取回登陆信息 -> 设置登陆状态

本来是很简单的一件事,公司以前做过也都封装好了一个ssoclient.jar包,只要设置下过滤器继承一个登陆成功的回调类就可以了,使用起来简单粗暴,然而很微妙的是第一步就出了问题....公司之前写的ssoclient.jar在第一步,未登录时过滤器内重定向到单点登陆,而单点登陆系统要求提供一个地址参数用于登陆成功后跳回去,然而jar包内代码却写死了,通过request来获取当前服务器的协议、地址、端口,拼接后重定向了过去

然而这样就造成了一个问题,在反向代理环境下,request拿到的数据是反向代理内部的内网ip和端口,不是外网ip和端口,结果就是单点登录系统跳不回去了,对应的还是struts2配置的重定向,也有一样的问题,而且看了下ssoclient并没有代码,反编译出来还要搭建开发环境才能编译回去,太麻烦了

搜了搜,解决方案之一是两边同步配置,Nginx配置转发真实ip和端口,tomcat通过插件读取并设置到request中

不过很明显,能通过配置解决的问题....不够好玩儿啊....喜欢搞事情的我就真的继续搞事情了

其实思路和上面说的解决方案是一样的,通过tomcat插件配置真实地址到request中并不通用(其他容器配置方式不一样),而核心思路是篡改request里的getServerPort等几个方法返回真实的外网地址,而非反向代理内部地址

那么问题就变成了如何对request进行篡改,很明显servlet规范里肯定是不提供这样的功能了,于是我想了想...可以拿Filter搞事情啊,如果我的Filter是第一个进行操作的过滤器,并且提供一个假的request和reponse给后续过滤器操作,那么无论是struts2还是ssoclient,他们拿到的request和response都是我构造的,而非原始的

有了这个思路就好办了,定义两个request和response的转发类,对大部分真实方法进行转发,需要篡改的方法返回配置文件中配置的数据,然后对302重定向重新生成地址(原来的相对地址如果由交给tomcat之类的容器补全路径返回出去就会出错,路径会补充成反向代理的内网地址),然后就完事了

试了下效果挺好的,完美骗过了ssoclient和struts2,代码运行很正常,目前为止没遇到什么bug

代码地址:https://coding.net/u/pppploi8/p/MyUtils/git/tree/master/Java/RProxyFilter

也算是在这里顺便安利下自己的工具类项目玩儿玩儿好了....顺便随便看看还有没有人访问这个博客2333333

话说回来最近还在作死尝试搞一套前后台通用的参数校验工具类,等写好了有时间也放上来好了

时间: 2024-10-06 04:31:39

[JavaEE]记录一下反向代理下SSO不能正常使用的一个坑的相关文章

CentOS 7下升级MySQL5.7.23的一个坑

发现CentOS 7下升级MySQL5.7.23的一个坑,以前面升级到MySQL 5.7.23的一个集群为例 在我们环境下打开文件描述符个数的参数open_files_limit在MySQL 5.6.21下都统一配置为65535,而CentOS 7系统下安装MySQL5.7.23的open_files_limit参数的默认值为5000 否则像分区表数量较多的集群,打开的文件个数过大时,数据库就会报错. 原因如下: 1.CentOS 7安装MySQL5.7.23,服务管理发生了变化,从sysvin

nginx反向代理下thinkphp、php获取不到正确的外网ip

在记录用户发送短信需要获取用户ip时,tp一直获取的是内网ip:10.10.10.10 tp框架获取ip方法:get_client_ip 1 /** 2 * 获取客户端IP地址 3 * @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字 4 * @param boolean $adv 是否进行高级模式获取(有可能被伪装) 5 * @return mixed 6 */ 7 function get_client_ip($type = 0,$adv=fal

Nginx反向代理下IIS获取真实IP

1. iis 如果放在反向代理后面,日志里的c-ip是反向代理服务器的ip,不是真正用户的ip,想要记录用户的ip要做两件事. 一.在反向代理设置X-Forwarded-For段,以下为nginx下的配置示例: server { location { …… proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for; …… } } 二.在iis站点上安装下面这个isapi filter,这东西是在f5的开发论坛上找到的,按开发者的话说

Linux中Nginx反向代理下的tomcat集群

Nginx具有反向代理(注意和正向代理的区别)和负载均衡等特点. 这次Nginx安装在 192.168.1.108 这台linux 机器上.安装Nginx 先要装openssl库,gcc,PCRE,zlib库等. Tomcat 安装在192.168.1.168 和 192.168.1.178 这两台机器上.客户端通过访问192.168.1.108 反向代理访问到 192.168.1.168 和 192.168.1.178 里Tomcat 部署的工程内容. 1.Linux 下安装Nginx (机器

多级反向代理下,Java获取请求客户端的真实IP地址多中方法整合

在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了. 如果使用了反向代理软件,将http://192.168.1.110:2046/ 的URL反向代理为 http://www.javapeixun.com.cn / 的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1 或 192.168.1.

Nginx多级反向代理下的IP透传

透传IP 为何要做透传IP 在使用了CDN做加速站点静态资源加速后,当用户请求的静态资源没能命中,此时CDN会到源站请求内容,那么此时访问源站的IP为CDN节点的IP,不仅如此,可能经我们的WAF防火墙和前端的负载均衡(SLB)后更不容易获取到真实的用户IP信息,我们如果要统计用户的访问IP和地区就变得比较麻烦,因为可能不是真实的IP,必须使用一个什么机制将用户IP传递到最终后端的应用服务器才行. 实验环境 访问流程 主机 IP配置 备注 Chrome 10.0.0.1 Windows浏览器 L

Ubuntu下iptables开放ftp端口的一个坑:227 Entering Passive Mode

事情是这样的,我搭的VSFTP服务器在一次重启后竟然外界连不上了,进去系统查看发现服务在正常运行着:内部也可登上排查发现是防火墙iptables的坑. 原来这个iptables规则是临时的,需要写入并save,不然重启后规则就清空了,造成外界无法登陆. 先说解决办法: iptables -A INPUT -p tcp --dport 21 -j ACCEPT iptables -A OUTPUT -p tcp --dport 20 -j ACCEPT iptables -A OUTPUT -p

Centos7下Nginx+Tomcat配置反向代理,使用memcached解决session一致性问题

一.session一致性问题 使用集群方案解决网站高并发问题时,就会部署多台应用服务器.当用户第一次通过客户端(如:浏览器)访问服务器时,服务器会创建对应的session, 使用Nginx反向代理,假如用户A第一次访问站点,被反向代理到服务器一处理,服务器一创建对应sessionA记录信息,用户A再次访问站点时,被反向代理到服务二处理, 而服务器二没有记录用户A的session信息,就会新创建sessionB,导致用户A之前操作丢失. 我们可以通过让多个服务器统一到同一个地方新建session和

Cento7+Nginx反向代理实现多域名跳转

近期比较忙,所以很少写文档了,最近有个项目组有多个环境需要做映射,所以就想到了通过Nginx反向代理实现多域名地址跳转,以致就总结了一下,其实说到代理我们大家都知道.最常见最常说的所谓的就是NAT,就是将内部多个地址请求通过代理转达到外部.这个就叫正向代理,那什么是反向代理呢-就是和正向代理相反:所以很好理解,Nginx反向代理功能很强大,可以通过一个nginx代理实现多个域名及不同的端口进行代理转发,所以在日常的运维中很有帮助.我们今天的演示是通过Nginx反向代理实现内部不同的多个域名转发.