12.java springboot 模拟https请求

前言:在springboot项目中我们的接口通常是以http提供给外部的,如何将其变为https请求呢

1.HTTP 和 HTTPS 请求的区别

  • HTTP:明文传输,数据在传输过程中容易被窃听、篡改或伪造。例如,用户名、密码等敏感信息可能会被中间人攻击者获取。

  • HTTPS:基于 SSL/TLS 协议加密传输,数据在客户端和服务器之间传输时被加密,能够有效防止数据被窃听和篡改。即使数据被截获,攻击者也无法解密内容。

总结来说,HTTPS 是 HTTP 的安全版本,通过加密和证书机制提供了更高的安全性,适合处理敏感信息(如登录、支付等)的场景。

要将 HTTP 请求转换为 HTTPS 请求,你需要在 Spring Boot 项目中配置 SSL。以下是详细的步骤:

1. 生成 SSL 证书

你可以使用 Java 的 keytool 工具来生成一个自签名的 SSL 证书。打开终端或命令提示符,执行以下命令:

keytool -genkeypair -alias myapp -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore myapp.p12 -validity 3650

在执行过程中,你需要设置一些信息,例如密钥库密码、姓名、组织单位等。请记住你设置的密钥库密码,后续配置会用到。

2. 将生成的证书文件放置到项目中

将生成的 myapp.p12 文件复制到 Spring Boot 项目的 src/main/resources 目录下。

3. 配置 application.properties 或 application.yml 文件

使用 application.properties

在 src/main/resources 目录下的 application.properties 文件中添加以下配置:

server.port=8080
server.ssl.key-store=classpath:myapp.p12
server.ssl.key-store-password=your_keystore_password
server.ssl.key-store-type=PKCS12
server.ssl.key-alias=myapp

请将 your_keystore_password 替换为你在生成证书时设置的密钥库密码。

使用 application.yml

如果你使用的是 application.yml 文件,可以添加以下配置:

server:
  port: 8080
  ssl:
    key-store: classpath:myapp.p12
    key-store-password: your_keystore_password
    key-store-type: PKCS12
    key-alias: myapp

4. 修改代码以支持 HTTPS

在 HttpstestApplication.java 中,你可以添加一个配置类来强制将 HTTP 请求重定向到 HTTPS 请求。以下是修改后的代码:

package com.hengbao.httpstest;

import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class HttpstestApplication {

    public static void main(String[] args) {
        SpringApplication.run(HttpstestApplication.class, args);
    }

    @Bean
    public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(redirectConnector());
        return tomcat;
    }

    private Connector redirectConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(8080);
        connector.setSecure(false);
        connector.setRedirectPort(8443); // 如果你希望重定向到 8443 端口
        return connector;
    }
}

5. 测试 HTTPS 请求

启动 Spring Boot 应用程序后,你可以使用浏览器或工具(如 Postman)来测试 HTTPS 请求。在浏览器中输入 https://localhost:8080/......,由于使用的是自签名证书,浏览器可能会提示不安全。你可以选择继续访问。

6.apipost验证

Spring Boot提供了一个简单的方法来模拟发送HTTPS请求,你可以使用RestTemplate类来发送请求。RestTemplate类提供了许多方法来发送HTTP请求,包括GET,POST,PUT和DELETE请求。 首先,你需要配置一个SSLContext实例,该实例将用于发送HTTPS请求。可以使用Java KeyStore(JKS)文件来配置SSLContext实例。JKS文件是包含证书和私钥的二进制文件。 以下是配置SSLContext的示例代码: ```java @Configuration public class AppConfig { @Value("${server.ssl.key-store}") private Resource keyStoreResource; @Value("${server.ssl.key-store-password}") private String keyStorePassword; @Value("${server.ssl.key-store-type}") private String keyStoreType; @Value("${server.ssl.key-alias}") private String keyAlias; @Bean public SSLContext sslContext() throws Exception { KeyStore keyStore = KeyStore.getInstance(keyStoreType); keyStore.load(keyStoreResource.getInputStream(), keyStorePassword.toCharArray()); KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); keyManagerFactory.init(keyStore, keyStorePassword.toCharArray()); SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(keyManagerFactory.getKeyManagers(), null, null); return sslContext; } } ``` 在这个配置类中,我们使用@Value注解来获取SSL配置信息。然后,我们使用KeyStore类来加载JKS文件,并使用KeyManagerFactory类来初始化SSLContext实例。 接下来,你可以使用RestTemplate类来发送HTTPS请求。以下是一个发送GET请求的示例代码: ```java @RestController public class MyController { @Autowired private RestTemplate restTemplate; @Autowired private SSLContext sslContext; @GetMapping("/api") public String get() throws Exception { HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); HttpClient httpClient = HttpClientBuilder.create().setSSLContext(sslContext).build(); requestFactory.setHttpClient(httpClient); restTemplate.setRequestFactory(requestFactory); ResponseEntity<String> response = restTemplate.getForEntity("https://example.com/api", String.class); return response.getBody(); } } ``` 在这个示例代码中,我们首先获取RestTemplate实例和SSLContext实例。然后,我们创建一个HttpComponentsClientHttpRequestFactory实例,并使用HttpClientBuilder类来创建一个HttpClient实例。我们将SSLContext实例设置到HttpClient实例中,以确保发送的请求HTTPS请求。最后,我们设置HttpComponentsClientHttpRequestFactory实例到RestTemplate实例中,并使用getForEntity()方法发送GET请求。 这就是使用Spring Boot发送HTTPS请求的示例代码。你可以使用类似的方法来发送其他HTTP请求
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值