java之httpclient点点补充-登录问题

本来有点不太想写这篇文章,原因是写了这个,就感觉WEB应用怎么都可以自己写代码访问内部的资源信息!不过出于技术本身的我还是考虑些点点东西,而且即使我不写,这玩意也有,呵呵,前面一篇文章我提及到双方要约定token来进行认证交互等等,如果你想访问某个网站内部的资源,而且是需要登录的,但是又想通过本地程序直接蹦进去,怎么蹦呢?

办法不是没有,其实httpclient就是模拟一个浏览器的功能,而登录的动作其实就是获取到你的cookie,而httpclient本身有记录cookie的功能,所以这并不难。

也就是说,你要用httpclient来模拟一个网站的登录,然后后续的操作;那么你只需要到那个网站的登录页面中找到用户名和密码的标签的name值,以及其action的目标地址,将其在本地开始进行模拟,标签,并类似于上一篇文章中编写用户名和密码并向action的目标地址发起的post操作(注意这里的POST应该是绝对路径,而不是页面看到的相对路径),此时你就能获取到你的cookie了

那么登录OK了,cookie获取到了,如何保存cookie呢?其实你根本不用保存,因为httpclient已经帮你保存了,接下来所有的动作,只需要你使用同一个httpclient对象,它们的cookie就是一致的,可以通过同一个httpclient对象发起多次POST或GET请求,这个时候内部想要请求什么就请求什么了。

貌似本文就结束了,要这么简单,我也不会专门抽出来写了,其实上述方法只能适合于一般的普通网站,如果网站的认证方法是https的,也就是你看到它的登录界面是https开头的,那就不行了因为协议不一样了,不过也是有办法的,这也是本文需要阐述的重点,要做这个工作,httpcleint请换成4以上的版本,对应到的包有:commons-httpclient-4.1.3.jar以及httpclient-4.1.2.jar两个包不是一样的内容,在这里这两个包都需要(注意一下代码为非U盾认证方式,U盾认证需要其他的代码来支持)。

加上了这两个包后,在程序开始部分import的内容应该包含:

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;

如果你有什么包引入不进来,说明你找的包还不对。
public class HttpsTest1 {

/**
* SSL部分的处理
* @param httpClient
* @throws NoSuchAlgorithmException
* @throws KeyManagementException
*/
private static void securityProcess(DefaultHttpClient httpClient)
              throws NoSuchAlgorithmException, KeyManagementException {
      TrustManager easyTrustManager = new X509TrustManager()  {
      public void checkClientTrusted(java.security.cert.X509Certificate[] x509Certificates, String s)
                     throws java.security.cert.CertificateException {}

           public void checkServerTrusted(java.security.cert.X509Certificate[] x509Certificates, String s)
                      throws java.security.cert.CertificateException {}

           public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return new java.security.cert.X509Certificate[0];
           }
       };
       SSLContext sslcontext = SSLContext.getInstance("TLS");

       sslcontext.init(null, new TrustManager[]{easyTrustManager}, null);
       SSLSocketFactory sf = new SSLSocketFactory(sslcontext);
       Scheme sch = new Scheme("https", 443, sf);
       httpClient.getConnectionManager().getSchemeRegistry().register(sch);
   }

   /**
   * 处理登录
   * @param httpClient
   * @throws UnsupportedEncodingException
   * @throws IOException
   * @throws ClientProtocolException
   */
   private static void login(DefaultHttpClient httpClient)
         throws UnsupportedEncodingException, IOException,ClientProtocolException {
       HttpPost httppost = new HttpPost("https://www.xxx.xxx.com/login/");//这是用户名和密码提交的目标路径
       List<NameValuePair> params=new ArrayList<NameValuePair>();
       params.add(new BasicNameValuePair("id",MyUserInfo.USER_NAME));//写入用户名
       params.add(new BasicNameValuePair("pass_word",MyUserInfo.PASSWORD));//写入密码

       httppost.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8));
       HttpResponse response = httpClient.execute(httppost);
       HttpEntity entity = response.getEntity();

       String content = EntityUtils.toString(entity);
       System.out.println(content);
   }

   public static void main(String[] args) throws Exception {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        try {
            securityProcess(httpClient);
            login(httpClient);
            //以下是你要请求其他的URL
            HttpGet get = new HttpGet("http://www.xxx.xxx.com/xxx/xxx");
            HttpResponse response2 = httpClient.execute(get);
            System.out.println(EntityUtils.toString(response2.getEntity()));
        }finally {
            httpClient.getConnectionManager().shutdown();
        }
     }
}

OK。代码细节上我不想多说,不过这段代码去请求一个https的登录是绝对没有问题的,可以将相应的URL换成自己系统的,再试一试!虽然是这个功能,不过,我个人还是不建议这样做,这样做太张扬了,这里仅仅为简单探讨下,可以用它写点程序实现远程系统的本地自动化处理步骤。

另外验证码需要一些解析程序,相对较为复杂,而且可能解析会有问题,对这类问题我也不想研究太多,呵呵,本文说提及的这个程序也和验证码无关。

时间: 2024-09-22 18:23:54

java之httpclient点点补充-登录问题的相关文章

网络编程-想做一个java b站的第三方登录,请问有什么比较方便的jar包可以引用?

问题描述 想做一个java b站的第三方登录,请问有什么比较方便的jar包可以引用? 如题,还是说只能用httpurlconnection?然后我用wireshark试图抓account.bilibili.com/login的数据包,结果死活抓不到post的包...感觉如果没有post包的话没办法进行数据分析...就没办法继续写下去了...由于是第一次设计,所以可能思路会有点问题,如果有做过类似程序的前辈感谢给出一点点建议....谢谢! import java.net.URL; import j

java发送HttpClient请求及接收请求结果过程的简单实例_java

一. 1.写一个HttpRequestUtils工具类,包括post请求和get请求 package com.brainlong.framework.util.httpclient; import net.sf.json.JSONObject; import org.apache.commons.httpclient.HttpStatus; import org.apache.http.HttpResponse; import org.apache.http.client.methods.Htt

java中HttpClient提示ConnectTimeoutException优化

最近的一个项目中需要用HttpClient请求多台远程服务器.由于接口调用有点频繁,结果出现了很多ConnectTimeoutException,于是对程序进行了优化. 业务逻辑的优化和减少请求次数的优化就不说了,下面重点说说HttpClient的优化. 先看看以前的代码,每次请求都会创建一个HttpClient,代码如下:  代码如下 复制代码 HttpClient client = getHttpClient(5000, 5000);   GetMethod getMethod = new

怎么用Java编写一个简单的登录系统?可以注册账号的那种

问题描述 怎么用Java编写一个简单的登录系统?可以注册账号的那种 数据库用的是MySQL,但Java操作方面的不知道怎么入手,求大神指点啊,有实例参考就更好了,谢谢 解决方案 import java.awt.event.*; import javax.swing.*; import java.awt.*; import java.awt.Container; import java.util.*; import java.sql.*; class Login extends JFrame im

java验证用户是否已经登录 java实现自动登录_java

本文为大家分享了java验证用户是否已经登录与实现自动登录的详细代码,供大家参考,具体内容如下 1.验证用户是否已经登录 package cn.hongxin.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletExceptio

java跨域名的单点登录

问题描述 java跨域名的单点登录 如题,我在网上看到的说有用cookie的,还有用什么协议的,我不知道该从哪一个方向入手,求大神给一个思路 解决方案 有很多开源的就可以直接使用,如cas 解决方案二: Java单点登录java之单点登录java实现单点登录

java使用jcifs实现域登录

问题描述 java使用jcifs实现域登录 公司新做的系统希望通过域登录来实现.在网上查找资料知道能用jcifs来实现.但是不知道怎么搞? 解决方案 http://wenku.baidu.com/link?url=hFpkoQMUT-I4YxR6bLQeia45H-Qv4jz3VTrxpog_zXOohoOSLfdnxc7Jagj1k04KqNtIILGs1-ZwwuoXPwxqTZ7RnIpAKNQnPIcNhNZF4uWhttp://www.cnblogs.com/yzy-lengzhu/a

txt文件-java的问题,用户登录后怎么和订单对应

问题描述 java的问题,用户登录后怎么和订单对应 因为用户user.java,ticket.java,都已经做好属性,登录可以用,但是怎么区分不同的用户买的ticket?我的订单是用txt读入导出的.所有的用户买的ticket都写入一个txt里面!当登录不同用户的时候怎么让txt读出显示各自的票?还有就是User u=new User();到底是写在哪里?写在注册登录(我注册登录的放在一个class)的话,那后面订票部分怎么用登录的u的信息?好表明这是u的票呢?仅是在控制台显示的简陋的程序,不

java的httpclient能实现linux中的curl -u命令吗?

问题描述 java的httpclient能实现linux中的curl -u命令吗? java的httpclient能实现linux中的curl -u命令吗?如何实现 解决方案 HttpClient类可以完成文件流的发送的,所以我觉得可以实现curl -u的功能. java还有一个FTPClient工具,也可以完成文件上传,应该对应的是ftp文件上传的功能的.