`
tianice
  • 浏览: 1847 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JavaEye api的用户认证

阅读更多
现在的网站越来越流行开放api了,看到java eye的api感觉挺简单的决定用apache的HttpClient试一下,没想到在认证就麻烦不断,经过摸索终于搞定了。后来搜索后发现两种方法论坛都有人做过了,在这就当是总结吧。

方法一:直接添加header验证,这中方式比较简单,代码如下
package apiTest;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;

public class Test {

	public static void main(String[] args) throws Exception {
		DefaultHttpClient httpClient = new DefaultHttpClient();
		//get请求
		HttpGet httpGet = new HttpGet("http://api.iteye.com/api/auth/verify");
		httpGet.addHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.63 Safari/534.3 JavaEye API Client");
		httpGet.addHeader("Authorization", "name:password");
		//请求内容
		HttpContext httpContext = new BasicHttpContext();
		
		HttpResponse response = httpClient.execute(httpGet,httpContext);
		HttpEntity httpEntity = response.getEntity();
		StringBuffer sb = new StringBuffer();
		InputStream is = httpEntity.getContent();
		BufferedReader br = new BufferedReader(new InputStreamReader(is, "utf-8"));
		String str = "";
		while((str=br.readLine()) != null){
			sb.append(str);
		}
		System.out.println("Code:"+response.getStatusLine().getStatusCode());
		System.out.println("Content:"+sb.toString());
		httpClient.getConnectionManager().shutdown();
	}
}

其中name:password是base64encode加密后内容;User-Agent使用模拟的Chrome的,加上了 JavaEye API Client,不模拟一个浏览器会被认为是网络爬虫抓取;

方法二:使用HttpClient的验证方式
package apiTest;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpException;
import org.apache.http.HttpHost;
import org.apache.http.HttpRequest;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScheme;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.AuthState;
import org.apache.http.auth.Credentials;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.protocol.ClientContext;
import org.apache.http.impl.auth.BasicScheme;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.ExecutionContext;
import org.apache.http.protocol.HttpContext;

public class Test {

	public static void main(String[] args) throws Exception {
		DefaultHttpClient httpClient = new DefaultHttpClient();
		//认证
		httpClient.getCredentialsProvider().setCredentials(new AuthScope(AuthScope.ANY_HOST,AuthScope.ANY_PORT), new UsernamePasswordCredentials("username", "password"));
		//get请求
		HttpGet httpGet = new HttpGet("http://api.iteye.com/api/auth/verify");
		httpGet.addHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.63 Safari/534.3 JavaEye API Client");
		//请求内容
		HttpContext httpContext = new BasicHttpContext();
		
		BasicScheme basicAuth = new BasicScheme();
		httpContext.setAttribute("preemptive-auth", basicAuth);
		httpClient.addRequestInterceptor(new HttpRequestInterceptor(){

			@Override
			public void process(HttpRequest request, HttpContext context)throws HttpException, IOException {
	            AuthState authState = (AuthState) context.getAttribute(ClientContext.TARGET_AUTH_STATE);
	            
	            // If no auth scheme avaialble yet, try to initialize it preemptively
	            if (authState.getAuthScheme() == null) {
	                AuthScheme authScheme = (AuthScheme) context.getAttribute("preemptive-auth");
	                CredentialsProvider credsProvider = (CredentialsProvider) context.getAttribute(ClientContext.CREDS_PROVIDER);
	                HttpHost targetHost = (HttpHost) context.getAttribute(ExecutionContext.HTTP_TARGET_HOST);
	                if (authScheme != null) {
	                    Credentials creds = credsProvider.getCredentials(new AuthScope(targetHost.getHostName(),targetHost.getPort()));
	                    if (creds == null) {
	                        throw new HttpException("No credentials for preemptive authentication");
	                    }
	                    authState.setAuthScheme(authScheme);
	                    authState.setCredentials(creds);
	                }
	            }
			}
			
		},0);
		
		HttpResponse response = httpClient.execute(httpGet,httpContext);
		HttpEntity httpEntity = response.getEntity();
		StringBuffer sb = new StringBuffer();
		InputStream is = httpEntity.getContent();
		BufferedReader br = new BufferedReader(new InputStreamReader(is, "utf-8"));
		String str = "";
		while((str=br.readLine()) != null){
			sb.append(str);
		}
		System.out.println("Code:"+response.getStatusLine().getStatusCode());
		System.out.println("Content:"+sb.toString());
		httpClient.getConnectionManager().shutdown();
	}
}


其中的HttpRequestInterceptor直接使用的HttpClient中的例子

用到的jar在apache上都有下载,版本看截图:




经过抓包发现两种方法都是在请求中添加了Authorization: username:password
  • 大小: 4.1 KB
0
0
分享到:
评论

相关推荐

    httpClient调用javaeye API验证用户

    JavaEye可能是一个提供用户认证服务的平台,而API则提供了验证用户身份的功能。 以下是一个关于如何使用HttpClient调用JavaEye API的基本步骤: 1. **导入必要的库**:首先,你需要在项目中导入HttpClient相关的...

    JavaEye的API使用帮助.rar

    JavaEye的API使用帮助是一个针对JavaEye开发框架的详细指南,旨在帮助开发者更好地理解和应用这个框架。这个压缩包包含了三个文件:一个PDF文档,一个TXT文本文件,以及一个URL链接。接下来,我们将深入探讨JavaEye ...

    javaeye api [java httpclient版] 简单封装

    JavaEye API 的简单封装主要基于 Java 的 HttpClient 库,提供了更方便、易用的接口来执行 HTTP 请求。HttpClient 是一个成熟的 Java 库,用于执行 HTTP 协议的客户端请求,而 JavaEyeClient 则是对这个库进行了一层...

    javaeye被黑

    javaeye被黑 大家看看

    基于JavaEye-API实现的Gerry-聊天QQ版v1.0 (全)

    NULL 博文链接:https://ago520.iteye.com/blog/754087

    javaeye热点阅读

    20. AJAX技术:包括ExtJS基础教程和jQuery图片循环效果,展示了AJAX如何提升用户体验。 此外,文件还涉及到了软件开发和项目管理的话题,如面子驱动编程、创业公司项目管理的挑战等,这些都是开发者职业生涯中不容...

    JavaEye3.0开发手记

    - **用途**:支持用户自定义标签的保存和操作。 **7. will_paginate** - **作用**:为Rails内置的分页功能提供更好的替代方案。 #### 五、文档与帮助资源 **1. fastri** - **功能**:加速 Ruby 文档查询的速度...

    JavaEye Client SourceCode

    2. **Android SDK**:作为基于Android平台的应用,JavaEye Client SourceCode必然使用了Android SDK,包括Android API的各种类库,例如视图(View)和布局(Layout)系统,以及用于网络通信、数据库操作、文件I/O等...

    javaeye的信息提示框代码之js

    javaeye的信息提示框代码之css,application.js

    JavaEye+技术架构

    JavaEye+技术架构,讲述java框架的应用

    android javaeye客户端

    而Android JavaEye客户端则是该社区为了满足移动用户需求,专门开发的一款应用程序,旨在让用户随时随地获取最新的技术资讯、参与讨论并分享自己的见解。本文将深入解析这个客户端,探讨其背后的技术实现以及对...

    javaeye代码高亮插件

    在现代浏览器中,由于Flash已逐渐被淘汰,可能需要使用其他技术(如clipboard API)来实现相同的功能。 要在WordPress中使用这些文件,你需要将它们上传到合适的目录,例如主题的`js`和`css`文件夹,并在主题的`...

    JavaEye新闻月刊_-_2009年3月_-_总第13期

    这些技术资源为前端开发者提供了丰富的选择,有助于提升网页设计和用户体验。 最后,在社区和工具方面,JavaEye采访了资深会员,收集了他们对于行业趋势和未来技术发展的预测,展示了开源项目的介绍,如LForum for ...

    javaEye客户端

    在处理网络请求时,可能需要考虑多线程或异步处理,以提高应用程序的性能和用户体验。JavaEye客户端可能包含有关如何使用Java的Thread类或ExecutorService来执行并发请求的示例。 六、调试与日志记录 为了方便调试...

    Android 中文API 合集(102 篇)

    ### Android中文API合集知识点概览 #### 一、引言 随着移动互联网的发展,Android作为全球最大的移动操作系统之一,在开发者社区中占据了重要的地位。为了帮助开发者更好地理解和使用Android的各种功能,Google提供...

    基于JavaEye-API实现的Gerry-聊天Dos版v1.0-lib库

    NULL 博文链接:https://ago520.iteye.com/blog/814571

Global site tag (gtag.js) - Google Analytics