下面的代码片段演示如何处理页面的重定向
client.executeMethod(post);
System.out.println(post.getStatusLine().toString());
post.releaseConnection();
// 检查是否重定向
int statuscode = post.getStatusCode();
if ((statuscode == HttpStatus.SC_MOVED_TEMPORARILY) || (statuscode == HttpStatus.SC_MOVED_PERMANENTLY) || (statuscode == HttpStatus.SC_SEE_OTHER) || (statuscode == HttpStatus.SC_TEMPORARY_REDIRECT)) {
// 读取新的 URL 地址
Headerheader=post.getResponseHeader("location");
if (header!=null){
Stringnewuri=header.getValue();
if((newuri==null)||(newuri.equals("")))
newuri="/";
GetMethodredirect=newGetMethod(newuri);
client.executeMethod(redirect);
System.out.println("Redirect:"+redirect.getStatusLine().toString());
redirect.releaseConnection();
}else
System.out.println("Invalid redirect");
}
我们可以自行编写两个JSP页面,其中一个页面用response.sendRedirect方法重定向到另外一个页面用来测试上面的例子。
4. 模拟输入用户名和口令进行登录
本小节应该说是HTTP客户端编程中最常碰见的问题,很多网站的内容都只是对注册用户可见的,这种情况下就必须要求使用正确的用户名和口令登录成功后,方可浏览到想要的页面。因为HTTP协议是无状态的,也就是连接的有效期只限于当前请求,请求内容结束后连接就关闭了。在这种情况下为了保存用户的登录信息必须使用到Cookie机制。以JSP/Servlet为例,当浏览器请求一个JSP或者是Servlet的页面时,应用服务器会返回一个参数,名为jsessionid(因不同应用服务器而异),值是一个较长的唯一字符串的Cookie,这个字符串值也就是当前访问该站点的会话标识。浏览器在每访问该站点的其他页面时候都要带上jsessionid这样的Cookie信息,应用服务器根据读取这个会话标识来获取对应的会话信息。
对于需要用户登录的网站,一般在用户登录成功后会将用户资料保存在服务器的会话中,这样当访问到其他的页面时候,应用服务器根据浏览器送上的Cookie中读取当前请求对应的会话标识以获得对应的会话信息,然后就可以判断用户资料是否存在于会话信息中,如果存在则允许访问页面,否则跳转到登录页面中要求用户输入帐号和口令进行登录。这就是一般使用JSP开发网站在处理用户登录的比较通用的方法。
这样一来,对于HTTP的客户端来讲,如果要访问一个受保护的页面时就必须模拟浏览器所做的工作,首先就是请求登录页面,然后读取Cookie值;再次请求登录页面并加入登录页所需的每个参数;最后就是请求最终所需的页面。当然在除第一次请求外其他的请求都需要附带上Cookie信息以便服务器能判断当前请求是否已经通过验证。说了这么多,可是如果你使用httpclient的话,你甚至连一行代码都无需增加,你只需要先传递登录信息执行登录过程,然后直接访问想要的页面,跟访问一个普通的页面没有任何区别,因为类HttpClient已经帮你做了所有该做的事情了,太棒了!下面的例子实现了这样一个访问的过程。
/*
* Created on 2003-12-7 by Liudong
*/
package http.demo;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.cookie.*;
import org.apache.commons.httpclient.methods.*;
/**
* 用来演示登录表单的示例
* @author Liudong
*/
public class FormLoginDemo {
static final String LOGON_SITE = "localhost" ;
static final int LOGON_PORT = 8080;
public static void main(String[] args) throws Exception{
HttpClient client = new HttpClient();
client.getHostConfiguration().setHost(LOGON_SITE, LOGON_PORT);
// 模拟登录页面 login.jsp->main.jsp
PostMethod post = new PostMethod( "/main.jsp" );
NameValuePair name = new NameValuePair( "name" , "ld" );
NameValuePair pass = new NameValuePair( "password" , "ld" );
post.setRequestBody( new NameValuePair[]{name,pass});
int status = client.executeMethod(post);
System.out.println(post.getResponseBodyAsString());
post.releaseConnection();
// 查看 cookie 信息
CookieSpec cookiespec = CookiePolicy.getDefaultSpec();
Cookie[] cookies = cookiespec.match(LOGON_SITE, LOGON_PORT, "/" , false , client.getState().getCookies());
if (cookies.length == 0) {
System.out.println( "None" );
} else {
for ( int i = 0; i < cookies.length; i++) {
System.out.println(cookies[i].toString());
}
}
// 访问所需的页面 main2.jsp
GetMethodget=newGetMethod("/main2.jsp");
client.executeMethod(get);
System.out.println(get.getResponseBodyAsString());
get.releaseConnection();
}
}
分享到:
相关推荐
### HttpClient 学习整理 #### 一、简介 `HttpClient`是Apache Jakarta Commons下的一个子项目,用于提供高效、最新及功能丰富的HTTP客户端编程工具包。对于那些希望通过HTTP协议访问网络资源的Java应用程序而言,...
`httpClient笔记.docx`可能是用户或教程作者整理的关于使用HttpClient的笔记或实战案例,可能包括一些常见问题的解决方案,比如处理重定向、处理cookies、上传下载文件、使用HTTPS等。 学习HttpClient时,除了API...
- **HTTP客户端**: 学习使用HttpURLConnection或HttpClient库发送HTTP请求并处理响应。 7. **反射机制** - **Class对象**: 理解如何获取类的信息,包括类名、方法、属性等。 - **动态代理**: 探究如何在运行时...
以下是对"最近在学习常用的Java开源项目,整理一下常用的代码.zip"这个压缩包中可能包含的知识点的详细解释: 1. **Maven或Gradle构建工具**:Java项目通常使用Maven或Gradle进行构建和依赖管理。通过查看项目的pom...
本项目是一个基于Java的工具类学习项目,旨在整理和演示各种工具类的使用方法。项目涵盖了从Excel处理、HTTP请求、JSON序列化到高性能网络框架Netty的使用等多个方面。通过本项目,开发者可以学习到如何使用这些工具...
免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,...
"apache"可能指的是Apache开源项目,或者是使用了Apache相关的技术,例如Apache HttpClient或Apache Ant等,这些在Android开发中常见且重要。而"#资源达人分享计划#"可能是一个社区活动或者论坛的标签,表示这是由...
3. **网络请求**:由于炸年兽活动可能涉及到网络交互,所以开发者可能使用了HTTP请求库,如Apache HttpClient,来处理网络通信。 4. **自动化工具开发**:自动炸年兽工具可能利用了定时任务、事件监听、模拟用户操作...
3. **Apache HttpClient**:在安卓开发中,如何使用Apache HttpClient库进行网络请求,包括GET、POST等操作,以及处理网络数据的方法。 4. **安卓自动化**:安卓点击助手可能涉及到自动化功能,如模拟点击、滑动等...
"FaceLook项目源码整理"是一个专注于Java编程的开源项目,它可能包含了用于面部识别、图像处理或视觉计算的相关代码。这个项目的目的是为了让开发者能够学习、理解和应用相关的技术。从提供的文件列表来看,我们可以...
在本压缩包中,你将找到一个Java实现的CSDN文章抓取与整理的项目,这将是一个很好的起点来学习和实践Java爬虫技术。 首先,了解Java爬虫的基础是必不可少的。Java作为一种流行的编程语言,拥有强大的网络处理库,如...
3. **Apache相关技术**:如使用Apache HttpClient进行网络请求,或者Apache Ant进行项目构建。 4. **应用版本控制**:如何从v1.2.8升级到v1.2.9,包括变更日志、bug修复、新功能添加等内容。 5. **盈利策略**:分析...
这是一份实用的源码整理,对于想要深入学习Java编程,特别是对Java在实际项目中的运用感兴趣的开发者来说,是非常有价值的参考资料。 1. **短信服务接口**:在Java项目中,通常会定义一个短信服务接口,这个接口...
这个压缩包文件“C#基类整理C#比较全的基类集合”可能包含了一系列C#基础类的代码示例和解释,帮助开发者理解和运用这些类。 首先,我们来看一下C#中的几个关键基类: 1. **System.Object**:所有C#类的终极基类,...
这份"Java核心知识点整理.rar"压缩包包含了对Java语言全面而深入的总结,对于初学者和有一定经验的开发者来说,都是宝贵的参考资料。下面,我们将详细探讨Java的核心知识点,并按照一个合理的学习路线进行阐述。 1....
这个压缩包“本人整理的一些常用的c#代码”显然是一个针对初学者的学习资源集合,包含了各种实用的C#代码示例,旨在帮助新手快速掌握编程基础。 1. **基础语法**:C#的基础语法结构包括变量声明、数据类型(如int、...
3. **异常处理**:Java提供了try-catch-finally语句块来处理运行时错误。理解Exception类层次结构以及如何自定义异常是必要的。 4. **集合框架**:ArrayList、LinkedList、HashSet、HashMap等是Java集合框架的重要...
这个源码整理主要关注如何在Java中使用HTTP进行Cookies的操作。以下是对这些知识点的详细解释。 首先,理解Cookies的基本概念。Cookies是由服务器端发送到客户端(浏览器)的一小段文本信息,用来存储用户的状态...
这份"java及php计开发资料...这份资料整理涵盖了Java和PHP的基础到进阶内容,对于开发者来说,无论是学习新技能还是提升现有能力,都将大有裨益。通过深入学习和实践这些知识点,可以成为一名优秀的Java或PHP开发者。