在使用CAS Server进行单点退出的实验时,一直不成功,最终跟终到的代码是cas server通过HttpURLConnection模拟了一个对客户端应用的POST请求,通过代码的调试发现,问题就出现在POST请求这里,客户端应用的SingleSignOutFilter过滤器接收到了这个请求,但是得到的请求却是GET请求,并且得不到所需的参数值。
为了进一步进行调试,把cas server中的请求过程拿出来做了一个测试类,如下:
public class TestConn { public static void main(String[] args) { String message = "<samlp:LogoutRequest xmlns:samlp=\"urn:oasis:names:tc:SAML:2.0:protocol\" ID=\"LR-8-3iFpmqdWBa5MAh2VW5u5FiPYvoOu2MOSe7q\" Version=\"2.0\" IssueInstant=\"2013-04-01T15:42:45Z\"><saml:NameID xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\">@NOT_USED@</saml:NameID><samlp:SessionIndex>ST-8-2PZRjTcDPWeBc6X4TVb6-cas</samlp:SessionIndex></samlp:LogoutRequest>"; String url = "http://localhost:8880/web"; int readTimeout = 50000; int connectionTimeout = 50000; HttpURLConnection connection = null; BufferedReader in = null; try { final URL logoutUrl = new URL(url); final String output = "logoutRequest=" + URLEncoder.encode(message, "UTF-8"); connection = (HttpURLConnection) logoutUrl.openConnection(); connection.setRequestMethod("POST"); connection.setDoInput(true); connection.setDoOutput(true); connection.setUseCaches(false); connection.setReadTimeout(readTimeout); connection.setConnectTimeout(connectionTimeout); connection.setRequestProperty("Content-Length", Integer.toString(output.getBytes().length)); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); final DataOutputStream printout = new DataOutputStream( connection.getOutputStream()); printout.writeBytes(output); printout.flush(); printout.close(); in = new BufferedReader(new InputStreamReader( connection.getInputStream())); while (in.readLine() != null) { // nothing to do } } catch (final SocketTimeoutException e) { e.printStackTrace(); } catch (final Exception e) { e.printStackTrace(); } finally { if (in != null) { try { in.close(); } catch (final IOException e) { // can't do anything } } if (connection != null) { connection.disconnect(); } } } }
这里的http://localhost:8880/web也配置了一个filter,内容如下:
@Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; System.out.println(request.getMethod()); System.out.println(request.getParameter("logoutRequest")); chain.doFilter(req, res); }
运行测试程序,在web端的控制台上面输出的内容为:
GET
null
null
得到这样的一个结果,实在是相当意外,这里测试程序里面可以看到,请求方法已经改为了POST,得到的却是GET请求。还以为是JDK的BUG,于是依次换成jdk1.5 1.6 1.7,多次进行测试,结果依旧。
终于,功夫不负苦心人,楼主一个不经意的举动换来了意想不到的收获,我把这里请求的URL不小心改成了
http://localhost:8880/web/
却在web控制台看到了这样的输出结果:
POST
<samlp:LogoutRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" ID="LR-8-3iFpmqdWBa5MAh2VW5u5FiPYvoOu2MOSe7q" Version="2.0" IssueInstant="2013-04-01T15:42:45Z"><saml:NameID xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">@NOT_USED@</saml:NameID><samlp:SessionIndex>ST-8-2PZRjTcDPWeBc6X4TVb6-cas</samlp:SessionIndex></samlp:LogoutRequest>
<samlp:LogoutRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" ID="LR-8-3iFpmqdWBa5MAh2VW5u5FiPYvoOu2MOSe7q" Version="2.0" IssueInstant="2013-04-01T15:42:45Z"><saml:NameID xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">@NOT_USED@</saml:NameID><samlp:SessionIndex>ST-8-2PZRjTcDPWeBc6X4TVb6-cas</samlp:SessionIndex></samlp:LogoutRequest>
居然正确了!!!
于是,果断把CAS client端的serverName后面增加“/”,再次进行单点退出的实验,成功!
相关推荐
1. 创建`URL`对象:使用`new URL(urlString)`创建一个URL对象,其中`urlString`是你要请求的URL地址。 2. 打开连接:通过`URLConnection`的`openConnection()`方法获取到`HttpURLConnection`对象,并调用`connect()...
为了解决这个问题,我们需要实现session共享,使得多次HTTP请求之间能够识别彼此,模拟浏览器的会话保持。 首先,理解Session和Cookie的概念是关键。Session是服务器端保存用户状态的一种方式,而Cookie则是客户端...
使用HttpURLConnection可以创建一个到指定URL的连接,然后通过这个连接发送HTTP请求。 1. **建立连接** 要使用HttpURLConnection,首先需要通过URL对象建立一个连接。例如: ```java URL url = new URL(...
首先,我们来看看如何使用Java的`java.net.URL`类和`java.net.HttpURLConnection`类来模拟发送GET请求并获取网页内容。 ##### 代码示例: ```java // 创建URL对象 URL url = new URL(...
在Android开发中,模拟HTTP请求是一项基础且重要的任务,它允许应用与远程服务器进行数据交互,获取或发送信息。本文将深入探讨如何在Android平台上实现HTTP请求,主要涉及以下几个方面: 1. **HTTP协议基础**:...
首先,你需要创建一个URL对象来表示目标服务器的地址,然后通过URL的openConnection()方法获取HttpURLConnection实例。设置请求方法(GET、POST等),添加请求头,并设置超时时间。发送请求后,可以通过...
HttpURLConnection是一个Java类,用于从网络中读取数据或向网络中写入数据。下面将详细介绍JAVA通过HttpURLConnection上传和下载文件的方法。 一、HttpURLConnection的概述 HttpURLConnection是Java中的一个类,...
HTTPS使用了公钥和私钥加密技术,其中服务器拥有一个公钥和一个私钥,客户端则使用服务器的公钥进行数据加密。在通信过程中,客户端和服务器会进行一次握手过程,确定加密算法和交换密钥,然后所有的数据传输都会被...
在上面的示例代码中,我们首先建立了一个连接,然后发送了一个登陆请求,并取得了 Cookie 信息。然后,我们使用取得的 Cookie 信息来访问其他接口,以便模拟用户的登陆行为。 结论 在本文中,我们介绍了 Java 模拟...
解决这个问题的方法是使用 `URI` 类来解析 URL,并将其分解成协议、主机名和路径部分。例如: ```java String url = "10.150.33.154:8080/getInfo/getUser"; URI uri = new URI(url); String scheme = uri.getScheme...
在Android应用开发中,模拟HTTP请求是至关重要的一个环节,特别是在与服务器进行数据交互时。本资料包聚焦于这一主题,提供了源码示例供学习参考。以下将详细讲解Android中进行HTTP请求的方法、原理以及涉及到的相关...
在本项目中,我们结合了Android、SpringBoot和Python,构建了一个简单的移动应用与服务器之间的数据交互示例。这个过程涵盖了客户端(Android)如何发起网络请求,以及服务器端(SpringBoot)如何处理这些请求和...
在Android应用开发中,模拟Http请求是至关重要的一个环节,特别是在进行毕业设计或者构建移动App时,我们需要与服务器进行数据交互,获取或提交用户信息、更新数据等。本项目"Android应用源码之31.模拟Http请求"提供...
要从指定的URL获取网页内容,首先需要创建一个`URL`对象,然后调用`openConnection()`方法得到`HttpURLConnection`实例。为了模拟浏览器(例如IE)的行为,可以设置`User-Agent`请求头。连接建立后,通过`...
本篇文章将深入探讨如何在Java中实现一个用于处理HTTPS请求的工具类。 首先,要实现HTTPS请求,我们需要导入Java的`java.net`和`javax.net.ssl`包,这两个包提供了处理网络连接和SSL/TLS安全协议的类。以下是一些...
1. **建立连接**:首先,通过`java.net.URL`类创建一个URL对象,然后调用`openConnection()`方法获取到`HttpURLConnection`对象。例如: ```java URL url = new URL("http://example.com"); HttpURLConnection ...
写入的数据将作为POST请求的一部分发送给服务器。 - **getInputStream()**:当连接建立后,可以使用此方法获取服务器响应的输入流,从而读取服务器返回的数据。 5. **模拟登录**: - 在模拟登录场景中,通常需要...
总的来说,这个项目涵盖了网络编程、网页抓取、数据库操作等多个方面,通过Java实现了一个完整的数据抓取和存储流程。在实际应用中,还需要注意遵守相关法律法规,尊重网站的robots.txt协议,以及合理使用抓取技术,...
`url.exe` 是一个可执行程序,通常用于执行特定的任务,比如在这种情况下,它可能是用来运行URL验证的命令行工具。用户可以通过命令行参数或者配置文件(如`config.ini`)来输入需要验证的URL列表,并设置验证的相关...
- **建立连接**:首先,我们需要创建一个URL对象,然后通过`openConnection()`方法获取HttpURLConnection实例。 - **设置请求方法**:默认为GET,可通过`setRequestMethod("POST")`设置为POST或其他HTTP方法。 - ...