在Java中实现有账号密码的Http代理访问

例如10.202.0.236是我们内网的一个服务,但是我们现在无法直接访问怎么办,可以通过一个可以访问内网的http代理服务器来进行访问。

局部使用

这里的主函数就是main函数了;
构建了三个方法,分别是getProxy,setAuthProperties和getContent。
这里的三个方法没有必要一定这么设置,只是我个人的习惯,觉得这样分开看上去会更加可读一些。

三个方法

getProxy

getProxy的用处是获取到proxy对象传入到URLConnection中作为参数来访问目标的地址,需要传入一个列表,分别对应的是http代理服务器的ip、port、username和password。

setAuthProperties

setAuthProperties是用于设置http的认证信息,以便于代理服务器可以认证通过,在getProxy中会对此方法进行调用。
Authenticator.setDefault是需要设置的,否则无法实现对代理服务器的用户名密码认证;
并且System.setProperty(“jdk.http.auth.tunneling.disabledSchemes”, “”);在JDK8以上都需要将这里这样设置的;

其实这里的System.setProperty也可以通过是启动Java程序时设置-Dhttp.proxyUser=username、-Dhttp.proxyPassowrd=password等设置的。

getContent

getContent就是最终的将二进制数据流转化为String进行输出了。

具体代码

package com.learn.myservlet;

import java.io.IOException;
import java.io.InputStream;
import java.net.*;
import java.util.ArrayList;
import java.util.List;


public class MyProxyLearn  {
    public static void main(String[] args) throws IOException {
        URL url = new URL("http://10.202.0.236:8080");

        // 构建传入代理连接的ip、port和用户名密码
        List<String> authList = new ArrayList<>();
        String hostname="myhost";
        String  port = "myport";
        String authUser = "myuser";
        String authPassword = "mypassword";
        authList.add(0,hostname);
        authList.add(1,port);
        authList.add(2,authUser);
        authList.add(3,authPassword);

        //通过代理进行连接
        URLConnection urlConnection = url.openConnection(getProxy(authList));

        //构建input输入流
        InputStream input = urlConnection.getInputStream();

        //将内容打印至控制台
        System.out.println(getContent(input));
    }

    //设置Proxy并返回
    public static  Proxy getProxy(List<String> authList){

        String hostname = authList.get(0);
        int port = Integer.parseInt(authList.get(1));
        String authUser = authList.get(2);
        String authPassword = authList.get(3);
        //设置认证信息
        setAuthProperties(authUser,authPassword);

        //构造proxy的地址和端口并返回
        SocketAddress socketAddress = new InetSocketAddress(hostname,port);
        Proxy proxy = new Proxy(Proxy.Type.HTTP,socketAddress);
        return proxy;
    }


    //设置认证相关信息
    private static void setAuthProperties(String authUser, String authPassword) {
        System.setProperty("http.proxyUser", authUser);
        System.setProperty("http.proxyPassword", authPassword);
        System.setProperty("jdk.http.auth.tunneling.disabledSchemes", "");
        Authenticator.setDefault(
                new Authenticator() {
                    @Override
                    public PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(authUser, authPassword.toCharArray());
                    }
                }
        );
    }

    //获取网页的内容,通过StringBuilder将bytes转化为char
    public static String getContent (InputStream input) throws IOException {
        String content;
        int n;
        StringBuilder sb = new StringBuilder();
        while ((n = input.read()) != -1) {
            sb.append((char) n);
        }
        content = sb.toString();
        return content;
    }

}

全局使用

构建了两个方法,分别是setAuthProperties和getContent。

setAuthProperties

设置所有的代理信息的

getContent

将input转化为String类型数据

package com.learn.myservlet;

import java.io.IOException;
import java.io.InputStream;
import java.net.*;
import java.util.ArrayList;
import java.util.List;


public class MyProxyLearn  {
    public static void main(String[] args) throws IOException {
        URL url = new URL("http://10.230.0.236:8081");

        // 构建传入代理连接的ip、port和用户名密码
        List<String> authList = new ArrayList<>();
        String hostname="myhost";
        String  port = "myport";
        String authUser = "myuser";
        String authPassword = "mypassword";
        authList.add(0,hostname);
        authList.add(1,port);
        authList.add(2,authUser);
        authList.add(3,authPassword);
        
        //加载全局的代理
        setAuthProperties(authList);

        URLConnection urlConnection = url.openConnection();

        //构建input输入流
        InputStream input = urlConnection.getInputStream();

        //将内容打印至控制台
        System.out.println(getContent(input));
    }



    //设置认证相关信息
    private static void setAuthProperties(List<String> authList) {
        String hostname = authList.get(0);
        String  port = authList.get(1);
        String authUser = authList.get(2);
        String authPassword = authList.get(3);
        System.setProperty("http.proxyHost", hostname);
        System.setProperty("http.proxyPort", port);
        System.setProperty("http.proxyUser", authUser);
        System.setProperty("http.proxyPassword", authPassword);
        System.setProperty("jdk.http.auth.tunneling.disabledSchemes", "");
        Authenticator.setDefault(
                new Authenticator() {
                    @Override
                    public PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(authUser, authPassword.toCharArray());
                    }
                }
        );
    }

    //获取网页的内容,通过StringBuilder将bytes转化为char
    public static String getContent (InputStream input) throws IOException {
        String content;
        int n;
        StringBuilder sb = new StringBuilder();
        while ((n = input.read()) != -1) {
            sb.append((char) n);
        }
        content = sb.toString();
        return content;
    }

}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值