java使用smiley-http-proxy-servlet实现反向代理,跳过SSL认证

本文介绍了如何使用Java通过开源项目smiley-http-proxy-servlet实现Nginx的反向代理功能,重点讲解了如何重写Servlet以跳过SSL认证,以及如何配置SpringBoot应用进行多地址代理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

        nginx可以实现反向代理,但是有时候需要使用java代码来实现,经过摸索,发现有开源的项目可以实现,所以简单记录一下如何使用

一、引入依赖

        没啥好说

    <dependency>
      <groupId>org.mitre.dsmiley.httpproxy</groupId>
      <artifactId>smiley-http-proxy-servlet</artifactId>
      <version>1.12.1</version>
    </dependency>

二、重写Servlet

        该项目的核心类是ProxyServlet,主要操作都在这个类中实现了,我们可以继承该类,重写其中的方法,自定义实现一些功能。

        这里我们继承ProxyServlet,重写了createHttpClient方法,使其跳过ssl认证

@Slf4j
public class CustomProxyServlet extends ProxyServlet {

    /**
     * 重写HttpClient,跳过ssl认证
     *
     * @return {@link HttpClient}
     */
    @Override
    protected HttpClient createHttpClient() {
        HttpClientBuilder clientBuilder = getHttpClientBuilder()
                .setDefaultRequestConfig(buildRequestConfig())
                .setDefaultSocketConfig(buildSocketConfig());

        clientBuilder.setMaxConnTotal(maxConnections);
        clientBuilder.setMaxConnPerRoute(maxConnections);
        if(! doHandleCompression) {
            clientBuilder.disableContentCompression();
        }
        if (useSystemProperties){
            clientBuilder.useSystemProperties();
        }

        SSLContext sslContext = this.getSslContext();
        SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);
        clientBuilder.setSSLSocketFactory(sslSocketFactory);
        return super.buildHttpClient(clientBuilder);
    }

    /**
     * 获取sslContext
     * @return {@link SSLContext}
     */
    public SSLContext getSslContext() {
        SSLContext sslContext = null;
        try {
            sslContext = SSLContextBuilder.create()
                    .loadTrustMaterial(TrustAllStrategy.INSTANCE)
                    .build();
        } catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException e) {
            log.error("获取sslContext失败", e);
        }
        return sslContext;
    }

}

三、添加配置

        添加配置类配置一下代理信息

代理信息配置

@Data
public class ProxyProperties {

    /**
     * 映射
     */
    private String mapping;

    /**
     * 目标url
     */
    private String targetUrl;
    
}

添加配置,控制是否启代理

@Data
@ConfigurationProperties(prefix = "proxy")
public class ProxyConfig {
    
    /**
     * 启用日志
     */
    private boolean enableLog;

    /**
     * 配置
     */
    private List<ProxyProperties> configs;
    
}

自动装配,获取自定义配置信息,通过for循环配置多个servlet

import lombok.RequiredArgsConstructor;
import org.mitre.dsmiley.httpproxy.ProxyServlet;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.ServletContextInitializer;
import org.springframework.context.annotation.Configuration;

import javax.servlet.ServletContext;
import javax.servlet.ServletRegistration;
import java.util.List;

@Configuration
@RequiredArgsConstructor
@EnableConfigurationProperties(ProxyConfig.class)
public class ProxyAutoConfiguration implements ServletContextInitializer {
    
    private final ProxyConfig proxyConfig;
    
    /**
     * Configure the given {@link ServletContext} with any servlets, filters, listeners
     * context-params and attributes necessary for initialization.
     *
     * @param servletContext the {@code ServletContext} to initialize
     */
    @Override
    public void onStartup(ServletContext servletContext) {
        List<ProxyProperties> configs = proxyConfig.getConfigs();
        for (int i = 0; i < configs.size(); i++) {
            ProxyProperties properties = configs.get(i);
            //定义多个servlet
            ServletRegistration initServlet = servletContext.addServlet("ProxyServlet"+i, CustomProxyServlet.class);
            initServlet.addMapping(properties.getMapping());
            initServlet.setInitParameter(ProxyServlet.P_TARGET_URI, properties.getTargetUrl());
            initServlet.setInitParameter(ProxyServlet.P_FORWARDEDFOR, "false");
            initServlet.setInitParameter(ProxyServlet.P_LOG, Boolean.toString(proxyConfig.isEnableLog()));
        }
    }
}

写在后面的话

        百度使用方法,大部分只能代理一个地址,而且不支持跳过ssl认证,所以这里记录一下,希望对你有用。

smiley-http-proxy-servlet是一个基于Java的代理服务器,可以用于转发请求并修改响应。要创建Proxy Servlet并修改cookie,您可以按照以下步骤进行: 1. 创建一个新的Java类并继承ProxyServlet类。 2. 重写doFilter方法,在方法中获取请求的cookie并进行修改,然后将请求转发给目标服务器。 3. 重写getProxyHost和getProxyPort方法,指定目标服务器的主机和端口。 4. 在web.xml文件中配置Servlet映射,使得请求能够正确地被代理Servlet处理。 下面是一个简单的示例代码,演示如何创建一个Proxy Servlet并修改cookie: ``` public class MyProxyServlet extends ProxyServlet { @Override protected void doFilter(HttpServletRequest servletRequest, HttpServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // 获取请求的cookie Cookie[] cookies = servletRequest.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if (cookie.getName().equals("myCookie")) { // 修改cookie cookie.setValue("newCookieValue"); servletResponse.addCookie(cookie); } } } // 转发请求给目标服务器 super.doFilter(servletRequest, servletResponse, filterChain); } @Override protected String getProxyHost(HttpServletRequest servletRequest) { // 指定目标服务器的主机 return "mytargetserver.com"; } @Override protected int getProxyPort(HttpServletRequest servletRequest) { // 指定目标服务器的端口 return 80; } } ``` 在web.xml文件中添加以下配置: ``` <servlet> <servlet-name>MyProxyServlet</servlet-name> <servlet-class>com.example.MyProxyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyProxyServlet</servlet-name> <url-pattern>/proxy/*</url-pattern> </servlet-mapping> ``` 以上示例代码仅供参考,具体实现需要根据您的具体需求进行调整。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值