0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用java代码设置代理服务器?

汽车电子技术 来源: 程序猿南栀 作者:程序猿南栀 2023-01-20 10:35 次阅读

关于如何使用java代码设置代理服务器

在今年年底和外资合作做的一个项目中,由于客户限制了服务器的外网访问权限,导致很多涉及到了第三方的API都无法进行访问,小编给项目组的成员提了一个建议

由于项目组的开发人员公共使用的调用第三方的工具类是基于org.springframework.web.client.RestTemplate进行开发的,所以本节我们就讲解RestTemplate中如何使用java代理

1.)当使用的代理服务器不需要密码验证时(使用系统参数进行设置代理)'作用域:整个系统'

static {
        String proxyHost = "代理的ip地址或域名";
        String proxyPort = "代理的端口";
        System.getProperties().setProperty("proxySet", "true");

        System.getProperties().setProperty("http.proxyHost", proxyHost);

        System.getProperties().setProperty("http.proxyPort", proxyPort);

        System.getProperties().setProperty("https.proxyHost", proxyHost);

        System.getProperties().setProperty("https.proxyPort", proxyPort);
}

上面这一部分代码可以放到RestTemplate工具类中,在项目进行启动的时候就进行全局设置代理,这个方法的作用范围是整个系统;

2.)当使用的代理服务器不需要密码验证时(使用Proxy设置代理)'作用域:指定的请求URL'

public String getData(String url, Map<String, String> param) throws IOException {
        // 设置代理
     SocketAddress socketAddress = new InetSocketAddress("代理的ip地址或域名", 代理的端口);
        Proxy proxy = new Proxy(Proxy.Type.HTTP, socketAddress);
        URL proxyUrl = new URL(url);
        proxyUrl.openConnection(proxy);
        // 请勿轻易改变此提交方式,大部分的情况下,提交方式都是表单提交
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        return restTemplate.getForEntity(url, String.class, param).getBody();
}

3.)当使用的代理服务器需要密码验证时(使用Proxy设置代理)作用域:指定的URL

由于代理服务器需要密码验证,所以我们需要使用java.net.Authenticator.Authenticator.setDefault(Authenticator authenticator)来注册实现密码验证

public class AuthenticatorUtil extends Authenticator {
    // 代理服务器用户名
    private String user = "";
 //代理服务器密码
    private String password = "";
    public MyAuthenticator(String user, String password) {
        this.user = user;
        this.password = password;
    }
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(user, password.toCharArray());
    }
}
public String getData(String url, Map<String, String> param) throws IOException {
     // TODO: 2023/1/5  设置代理服务器用户名和密码
        Authenticator.setDefault(new AuthenticatorUtil("username", "password"));
        // TODO: 2023/1/5 设置代理服务器的ip地址(域名)和端口
     SocketAddress socketAddress = new InetSocketAddress("代理的ip地址或域名", 代理的端口);
        Proxy proxy = new Proxy(Proxy.Type.HTTP, socketAddress);
        URL proxyUrl = new URL(url);
        proxyUrl.openConnection(proxy);
        // 请勿轻易改变此提交方式,大部分的情况下,提交方式都是表单提交
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        return restTemplate.getForEntity(url, String.class, param).getBody();
}

Java在请求某些不受信任的https网站时会报:'PKIX path building failed'

这个问题也是在做开发的时候遇到的,报错如下

"I/0 error on PosT reguest for  "https://sfapi-sbox,sf-express.com/std/service ": sunsecurity.validator.ValidatorException: PKIX pathbuilding failed: sun,security,provider.certpathSunCertPathbuilderException: unable to find valid certification path to reguested target; nestedexception is iavax.net.ssl.SSLHandshakeException: sun,security.validator.ValidatorException: PKIX pathbuilding failed: sun,security.provider,certpath,SunCertPathbuilderException: unable to find validcertification-path to requested target"

有些小伙伴看到这个报错,可能以为是请求不通,其实并不是,而是https://sfapi-sbox,sf-express.com/std/service这个地址不受信任,使用https进行请求的话,所以就有了下面的工具类,用程序重新方法,信任所有的SSL证书

package com.vca.common.utils;

import lombok.SneakyThrows;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.net.ssl.*;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

/**
 * @Description:信任所有证书工具类
 * @author:chenbing
 * @date 2023/1/4 17:40
 */
public class SslUtil {
    //创建日志记录工具
    public static final Logger logger = LoggerFactory.getLogger(SslUtil.class);

    private static void trustAllHttpsCertificates() throws Exception {
        TrustManager[] trustAllCerts = new TrustManager[1];
        TrustManager tm = new miTM();
        trustAllCerts[0] = tm;
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, null);
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    }

    static class miTM implements TrustManager, X509TrustManager {
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }

        public boolean isServerTrusted(X509Certificate[] certs) {
            return true;
        }

        public boolean isClientTrusted(X509Certificate[] certs) {
            return true;
        }

        public void checkServerTrusted(X509Certificate[] certs, String authType)
                throws CertificateException {
            return;
        }

        public void checkClientTrusted(X509Certificate[] certs, String authType)
                throws CertificateException {
            return;
        }
    }

    /**
     * @Description:忽略HTTPS请求的SSL证书,必须在openConnection之前调用
     * @author:chenbing
     * @date 2023/1/4 18:00
     */
    @SneakyThrows
    public static void ignoreSsl() {
        HostnameVerifier hv = new HostnameVerifier() {
            public boolean verify(String urlHostName, SSLSession session) {
                logger.info("Warning: URL Host: " + urlHostName + " vs. " + session.getPeerHost());
                return true;
            }
        };
        trustAllHttpsCertificates();
        HttpsURLConnection.setDefaultHostnameVerifier(hv);
    }
}
public String postFormData(String url, MultiValueMap<String, String> map) {
        HttpHeaders headers = new HttpHeaders();
     //再发送请求之前调用ignoreSsl()方法,忽略掉HTTPS请求的SSL证书
        SslUtil.ignoreSsl();
//        headers.setContentType(MediaType.MULTIPART_FORM_DATA);
        HttpEntityString, String>> requests = new HttpEntityString, String>>(map, headers);
        String body = restTemplate.postForEntity(url, requests, String.class).getBody();
        return body;
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    102994
  • 开发
    +关注

    关注

    0

    文章

    343

    浏览量

    40607
  • 工具
    +关注

    关注

    3

    文章

    305

    浏览量

    27434
收藏 人收藏

    评论

    相关推荐

    10个关于linux中Squid代理服务器的实用面试问答

    不仅是系统管理员和网络管理员时不时会听到“代理服务器”这个词,我们也经常听到。代理服务器已经成为一种企业常态,而且经常会接触到它。它现在也出现在一些小型的学校或者大型跨国公司的自助餐厅里。Squid
    发表于 09-28 10:19

    Vivado 2015.4无法连接下载,需要一个代理服务器

    嗨,Vivado SDK 2015.4告诉我它无法连接下载,我想它需要一个代理服务器,但我不知道如何给它。以上来自于谷歌翻译以下为原文Hi,Vivado SDK 2015.4 tells me
    发表于 12-21 11:10

    linux通过代理服务器来上网

    有时,某个服务器无法联网。想联网的话,可以通过代理服务器。下载一个ccproxy,安装完成后,打开该软件,点击‘设置’:
    发表于 07-24 06:41

    网络代理服务器的磁盘驱动器

     网络代理服务器的磁盘驱动器  网络加速产品同台式机、服务器类似,多采用IDE和SCSI硬盘作为介质存储设备。典型类型
    发表于 01-07 14:05 650次阅读

    网络代理服务器的内存

    网络代理服务器的内存              网络加速产品多采用SDRAM 和DDR SDRAM两种内存。  &nb
    发表于 01-07 14:06 551次阅读

    网络代理服务器的网络接口

    网络代理服务器的网络接口         
    发表于 01-07 14:08 580次阅读

    网络代理服务器

    网络代理服务器              网络代理服务器有别于传统的网络加速软件,它是专门指高速缓存服务器产品,即Cache
    发表于 01-07 14:09 940次阅读

    Apache代理服务器配置说明

    Apache代理服务器 1. 安装apache。 2. 修改\Apache\conf\httpd.conf配置文件, 首先要添加代理服务器模块。找到下面这几行: #LoadModule
    发表于 04-29 16:49 0次下载

    vpn代理服务器_VPN代理软件下载

    vpn代理服务器使用,通过vpn代理登录谷歌电子市场,本文提供了vpn代理软件下载,供vpn代理使用的朋友下载
    发表于 09-14 09:50 111次下载

    怎样在树莓派中设置代理服务器

    代理服务器的主机名或IP地址和端口
    的头像 发表于 09-24 16:59 2.5w次阅读

    基于高斯混合模型的Web代理服务器缓存

    基于高斯混合模型的Web代理服务器缓存
    发表于 06-23 16:46 17次下载

    代理服务器IP如何使用,这几点需要注意了

    作为信息的中转站,伪装自己的真实IP,保障上网安全。那么,如何安全且合理的使用代理IP技术呢? 代理服务器是介于客户端和Web服务器之间的另一台服务器,有了它之后,浏览器不是直接到We
    的头像 发表于 07-22 17:19 3871次阅读

    详解Nginx高性能的HTTP和反向代理服务器

    Nginx 是一个高性能的 HTTP 和反向代理服务器,特点是占用内存少,并发能力强,事实上 Nginx 的并发能力确实在同类型的网页服务器中表现较好。
    的头像 发表于 03-16 11:23 2049次阅读

    python代码中如何使用HTTP代理

    HTTP代理就是介于浏览器和web服务器之间的一台服务器,连接代理后,浏览器不再直接向web服务器取回网页,而是向
    的头像 发表于 09-13 09:24 1055次阅读

    使用代理服务器的安全注意事项和风险

    代理服务器充当用户和互联网之间的中介,转发请求并出于安全和隐私目的隐藏用户的IP地址。它接收用户请求,将其转发到Web服务器,并将响应发送回用户,同时保持匿名。 下面,小编给大家科普一下
    的头像 发表于 08-10 17:55 654次阅读