当前位置:首页 > 开发 > 编程语言 > Http > 正文

HttpURLConnection模拟URL请求的一个问题

发表于: 2013-04-01   作者:dinguangx   来源:转载   浏览次数:
摘要:      在使用CAS Server进行单点退出的实验时,一直不成功,最终跟终到的代码是cas server通过HttpURLConnection模拟了一个对客户端应用的POST请求,通过代码的调试发现,问题就出现在POST请求这里,客户端应用的SingleSignOutFilter过滤器接收到了这个请求,但是得到的请求却是GET请求,并且得不到所需的参数值。 &

 

   在使用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后面增加“/”,再次进行单点退出的实验,成功!

 

HttpURLConnection模拟URL请求的一个问题

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
python模拟Get请求保存网易歌曲的url 作者:vpoet mail:vpoet_sir@163.com 日期:大约在夏季 1 #codin
Phpclient 库 当服务器后台准备向另一台服务器发送请求时,我们可以使用使用php模拟http请求。方法
在csdn里答复一个网友的实例代码 一下代码是通过socket请求一个HTTP服务的过程,通过模拟请求一个web
转至 http://blog.csdn.net/huzgd/article/details/8712187 安卓和JAVA应用开发少不了要提交HTTP请
在android应用程序中,可以使用HttpURLConnection发送HTTP请求。详见如下实例 1、activity_main.xml
概述 与httpwath相比,fiddler能模拟http请求、能断点调试、http分析统计吸引了我,使用之后感觉这
概述 与httpwath相比,fiddler能模拟http请求、能断点调试、http分析统计吸引了我,使用之后感觉这
新建两个jsp文件,index1.jsp,index2.jsp index1.jsp <html> <body> <% //forward
引言 最近有朋友问如何用winform模拟post请求,然后登录网站,稍微想了一下,大致就是对http报文的
引言 最近有朋友问如何用winform模拟post请求,然后登录网站,稍微想了一下,大致就是对http报文的
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号