WebClient-Session和Cookie

本文探讨了WebClient在处理Session和Cookie时的局限性,提供了两种解决方案:一是直接处理请求和响应报文头;二是继承WebClient并重写GetWebRequest方法。文中还附带示例代码帮助理解。

背景知识:Session和Cookie

http://blog.csdn.net/X_Craft/archive/2009/07/19/4361989.aspx

 

WebClient不会保存http响应报文中的SetCookie,更不会设置下一次http请求报文的Cookie,通过HTTP分析工具可以观察到这一点。也就是说两个WebClient调用之间不具有持续性。

 

在session方面一个典型的应用就是自动登录,在“Session和Cookie”一章中有一个Login.asp和ListData.asp,Login.asp在session中记录用户登录信息,ListData.asp中操作这个信息,而贯穿这两个页面的条件是session id和同一浏览器,服务端在Login.asp的HTTP响应报文头的SetCookie中返回session id浏览器在内存中保存session id 并在下一次对ListData.asp的请求报文中设置Cookie内容为session id,因为WebClient不具持续性,所以默认情况下利用WebClient是无法实现Login.asp自动登录后再调用ListData.asp显示出正确的用户名的。

 

在cookie方面,“Session和Cookie”一章中的Welcome.asp是一个典型例子,服务端在WelCome.asp响应报文头的SetCookie段中返回Cookie内容,浏览器会在磁盘上保存这个cookie,并在下一次对Welcom.asp的请求报文头中设置Cookie内容,因为WebClient不具持续性所以使用WebClient去访问这个页面,始终会返回第一次登录的信息。

 

无论是上述的session还是cookie应用,要使WebClient具有持续性,就需要在代码中处理SetCookie和Cookie

 

一种方式是直接处理WebClient的请求和响应报文头,以下是登录应用的示例代码

 

对于Welcome.asp的处理也是一样

 

另一种方式是继承WebClient,重写GetWebRuquest方法,具体代码请参考网上的相关文章。

 

 

参考资料:

 

WebClient类的使用中遇到的几个问题

http://bccu.cnblogs.com/archive/2006/04/29/388770.aspx

 

从WebBrowser中取得Cookie 和 WebClient设置cookie!

http://www.cnblogs.com/cai9911/archive/2008/03/05/1091443.html

 

实现支持会话的WebClient

http://www.cnblogs.com/listhome/archive/2007/11/22/968963.html

 

WebClient 保持 Session 和 Cookie

http://www.cnblogs.com/anjou/archive/2008/05/25/1206832.html

 

 

 

 

 

### HtmlUnit WebClient 使用方法 WebClient 类是 HtmlUnit 中的核心类之一,用于模拟浏览器行为并加载网页。创建 WebClient 实例时,默认会使用 `BrowserVersion.getDefault()` 来初始化浏览器版本设置[^1]。 #### 创建 WebClient 对象 要启动一个 WebClient 并访问页面: ```java import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlPage; public class Example { public static void main(String[] args) throws Exception { try (final WebClient webClient = new WebClient()) { // 初始化 WebClient final HtmlPage page = webClient.getPage("http://example.com"); // 加载指定 URL 页面 System.out.println(page.asText()); // 输出页面文本内容 } } } ``` #### 设置浏览器版本 可以显式设定不同的浏览器版本来匹配目标网站的要求: ```java webClient.getOptions().setJavaScriptEnabled(true); // 启用 JavaScript 支持 webClient.setBrowserVersion(BrowserVersion.CHROME); // 设定 Chrome 浏览器模式 ``` #### 处理 Cookies Sessions 对于需要登录或其他依赖 session 的操作,可以通过管理 cookies 来保持会话状态: ```java CookieManager cookieManager = webClient.getCookieManager(); cookieManager.setCookiesEnabled(true); // 添加自定义 Cookie cookieManager.addCookie(new Cookie("domain", "name", "value")); ``` #### 常见问题及解决方案 - **超时异常** 如果遇到连接或读取超时错误,可调整 WebClient 超时时间配置: ```java webClient.setTimeout(60 * 1000); // 设置最大等待时间为 60 秒 ``` - **JavaScript 错误** 当启用 JavaScript 执行时可能会抛出未处理的脚本错误,可通过忽略这些警告继续执行: ```java webClient.getOptions().setThrowExceptionOnScriptError(false); ``` - **重定向失败** 若发现某些情况下无法正常跟随 HTTP 重定向,则应确认是否启用了自动重定向功能: ```java webClient.getOptions().setRedirectEnabled(true); ``` 通过上述介绍可以看出,HtmlUnit 提供了一套完整的 API 接口用于自动化测试 Web 应用程序,并且能够很好地应对各种复杂的网络环境交互逻辑需求[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值