`
dinguangx
  • 浏览: 245649 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

HttpURLConnection模拟URL请求的一个问题

    博客分类:
  • J2SE
阅读更多

 

   在使用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

   得到这样的一个结果,实在是相当意外,这里测试程序里面可以看到,请求方法已经改为了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>

 居然正确了!!!

 

于是,果断把CAS client端的serverName后面增加“/”,再次进行单点退出的实验,成功!

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    java后台调用HttpURLConnection类模拟浏览器请求实例(可用于接口调用)

    1. 创建`URL`对象:使用`new URL(urlString)`创建一个URL对象,其中`urlString`是你要请求的URL地址。 2. 打开连接:通过`URLConnection`的`openConnection()`方法获取到`HttpURLConnection`对象,并调用`connect()...

    java实现多次HttpURLConnection共享session

    为了解决这个问题,我们需要实现session共享,使得多次HTTP请求之间能够识别彼此,模拟浏览器的会话保持。 首先,理解Session和Cookie的概念是关键。Session是服务器端保存用户状态的一种方式,而Cookie则是客户端...

    使用Java模拟http请求.rar

    使用HttpURLConnection可以创建一个到指定URL的连接,然后通过这个连接发送HTTP请求。 1. **建立连接** 要使用HttpURLConnection,首先需要通过URL对象建立一个连接。例如: ```java URL url = new URL(...

    JAVA模拟网页发送请求

    首先,我们来看看如何使用Java的`java.net.URL`类和`java.net.HttpURLConnection`类来模拟发送GET请求并获取网页内容。 ##### 代码示例: ```java // 创建URL对象 URL url = new URL(...

    andriod 模拟Http请求

    在Android开发中,模拟HTTP请求是一项基础且重要的任务,它允许应用与远程服务器进行数据交互,获取或发送信息。本文将深入探讨如何在Android平台上实现HTTP请求,主要涉及以下几个方面: 1. **HTTP协议基础**:...

    31.模拟Http请求.rar

    首先,你需要创建一个URL对象来表示目标服务器的地址,然后通过URL的openConnection()方法获取HttpURLConnection实例。设置请求方法(GET、POST等),添加请求头,并设置超时时间。发送请求后,可以通过...

    JAVA通过HttpURLConnection 上传和下载文件的方法

    HttpURLConnection是一个Java类,用于从网络中读取数据或向网络中写入数据。下面将详细介绍JAVA通过HttpURLConnection上传和下载文件的方法。 一、HttpURLConnection的概述 HttpURLConnection是Java中的一个类,...

    模拟https请求

    HTTPS使用了公钥和私钥加密技术,其中服务器拥有一个公钥和一个私钥,客户端则使用服务器的公钥进行数据加密。在通信过程中,客户端和服务器会进行一次握手过程,确定加密算法和交换密钥,然后所有的数据传输都会被...

    Java 模拟cookie登陆简单操作示例

    在上面的示例代码中,我们首先建立了一个连接,然后发送了一个登陆请求,并取得了 Cookie 信息。然后,我们使用取得的 Cookie 信息来访问其他接口,以便模拟用户的登陆行为。 结论 在本文中,我们介绍了 Java 模拟...

    java模拟http请求的错误问题整理

    解决这个问题的方法是使用 `URI` 类来解析 URL,并将其分解成协议、主机名和路径部分。例如: ```java String url = "10.150.33.154:8080/getInfo/getUser"; URI uri = new URI(url); String scheme = uri.getScheme...

    Android应用源码之31.模拟Http请求(.zip

    在Android应用开发中,模拟HTTP请求是至关重要的一个环节,特别是在与服务器进行数据交互时。本资料包聚焦于这一主题,提供了源码示例供学习参考。以下将详细讲解Android中进行HTTP请求的方法、原理以及涉及到的相关...

    Android + SptringBoot +数据采集 ,模拟一次简单的网络请求

    在本项目中,我们结合了Android、SpringBoot和Python,构建了一个简单的移动应用与服务器之间的数据交互示例。这个过程涵盖了客户端(Android)如何发起网络请求,以及服务器端(SpringBoot)如何处理这些请求和...

    Android应用源码之31.模拟Http请求(-IT计算机-毕业设计.zip

    在Android应用开发中,模拟Http请求是至关重要的一个环节,特别是在进行毕业设计或者构建移动App时,我们需要与服务器进行数据交互,获取或提交用户信息、更新数据等。本项目"Android应用源码之31.模拟Http请求"提供...

    【Java】java.net.HttpURLConnection的使用.doc

    要从指定的URL获取网页内容,首先需要创建一个`URL`对象,然后调用`openConnection()`方法得到`HttpURLConnection`实例。为了模拟浏览器(例如IE)的行为,可以设置`User-Agent`请求头。连接建立后,通过`...

    Java实现的Https请求工具类

    本篇文章将深入探讨如何在Java中实现一个用于处理HTTPS请求的工具类。 首先,要实现HTTPS请求,我们需要导入Java的`java.net`和`javax.net.ssl`包,这两个包提供了处理网络连接和SSL/TLS安全协议的类。以下是一些...

    java发送http请求工具类

    1. **建立连接**:首先,通过`java.net.URL`类创建一个URL对象,然后调用`openConnection()`方法获取到`HttpURLConnection`对象。例如: ```java URL url = new URL("http://example.com"); HttpURLConnection ...

    java URLConnection总结(经典易懂)

    写入的数据将作为POST请求的一部分发送给服务器。 - **getInputStream()**:当连接建立后,可以使用此方法获取服务器响应的输入流,从而读取服务器返回的数据。 5. **模拟登录**: - 在模拟登录场景中,通常需要...

    java模拟http请求登陆抓取海投网信息

    总的来说,这个项目涵盖了网络编程、网页抓取、数据库操作等多个方面,通过Java实现了一个完整的数据抓取和存储流程。在实际应用中,还需要注意遵守相关法律法规,尊重网站的robots.txt协议,以及合理使用抓取技术,...

    url有效性批量验证

    `url.exe` 是一个可执行程序,通常用于执行特定的任务,比如在这种情况下,它可能是用来运行URL验证的命令行工具。用户可以通过命令行参数或者配置文件(如`config.ini`)来输入需要验证的URL列表,并设置验证的相关...

    Android应用源码之31.模拟Http请求.zip

    - **建立连接**:首先,我们需要创建一个URL对象,然后通过`openConnection()`方法获取HttpURLConnection实例。 - **设置请求方法**:默认为GET,可通过`setRequestMethod("POST")`设置为POST或其他HTTP方法。 - ...

Global site tag (gtag.js) - Google Analytics