目录
- 报错信息
- 问题背景
- 问题原因
- 现场服务器情况
- 流程
- 修改方法
报错信息
2016-08-18 17:05:08.718 [http-bio-8080-exec-9] ERROR org.jasig.cas.client.util.CommonUtils.getResponseFromServer - 连接超时
java.net.ConnectException: 连接超时
java.net.ConnectException: Connection timed out(Connection timed out)
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:673)
at sun.security.ssl.BaseSSLSocketImpl.connect(BaseSSLSocketImpl.java:173)
at sun.net.NetworkClient.doConnect(NetworkClient.java:180)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
at sun.net.www.protocol.https.HttpsClient.(HttpsClient.java:264)
at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:367)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:191)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1156)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1050)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:177)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1564)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:263)
at org.jasig.cas.client.util.CommonUtils.getResponseFromServer(CommonUtils.java:431)
at org.jasig.cas.client.validation.AbstractCasProtocolUrlBasedTicketValidator.retrieveResponseFromServer(AbstractCasProtocolUrlBasedTicketValidator.java:41)
at org.jasig.cas.client.validation.AbstractUrlBasedTicketValidator.validate(AbstractUrlBasedTicketValidator.java:193)
at com.mlcp.org.pac4j.cas.credentials.authenticator.CasAuthenticator.validate(CasAuthenticator.java:62)
问题背景
自己搞了一个web项目, 搞了一个cas-overlay单点登录服务, 配置好后, 将web和cas放到一个tomcat, 可以正常跳转, 没有任何问题, 之后把两个项目放到现场的linux服务器的tomcat中, 输入用户名和密码之后不跳转到主界面, 一直卡着不动
问题原因
主要是因为现场服务器做了ip映射
我们知道在输入完用户名和密码进行登录时, cas-server会返回一个ticket, 之后会用这个ticket去服务器端校验, 如果校验通过会返回用户名, 并进行一系列操作, 最后跳转
出现上面的报错就是因为第五步发生了问题, 去cas-server端检验ticket, 没有连接到cas-server, 所以超时了
现场服务器情况
流程
- 浏览器访问 10.52.2.156:18080/home
- cas拦截 自动跳转到 10.52.2.156:18080/cas/login?service=https://10.52.2.156:18080/home
- 输入用户名和密码
- 页面卡死, tomcat服务器报错, 页面不跳转
页面跳转时, 去cas-server去校验ticket , 校验的链接是 :
http://10.52.2.156:18080/cas/serviceValidate?ticket=ST-4-4ATNzEfBzFhL9XJ2k3j1MK0WhmEhost-192-168-100-101&service=http%3A%2F%2F10.52.2.156%3A18080%2Fhome
看到这里, 想必大家都知道问题了. web去cas校验ticket 数据linux服务器内部访问, 不能在使用映射ip和端口了, 应该使用linux服务器真正的ip和端口, 也就是
http://192.168.100.101:8080/cas/serviceValidate?ticket=ST-4-4ATNzEfBzFhL9XJ2k3j1MK0WhmEhost-192-168-100-101&service=http%3A%2F%2F10.52.2.156%3A18080%2Fhome
因此我们只需要修改校验ticket的ip和端口就可以了, 看一下源码
web段的 AbstractUrlBasedTicketValidator类的constructValidationUrl方法
修改方法
将项目打包后, 使用解压软件打开jar/war包, 替换/lib 下面jar包里面的class文件就可以了
替换class文件教程 :
https://blog.csdn.net/weixin_43178406/article/details/119037447
我自己修改的文件 :
之后进行登录, 正常跳转