当前位置: 首页 > 知识库问答 >
问题:

如何使用Spring启动 2.3.1 将流量重定向到 https

田英卓
2023-03-14

下午好,我正在使用spring boot,并且已经实现了http安全模式(https ),但是我需要知道如何将http请求重定向到https,以及是否有必要指定一个特定的安全端口,比如443,或者我可以使用任何端口。目前我使用端口8080 8443

我的班级

主要类别

package com.prueba.https;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication
public class PruebaHttpsApplication {

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

}

请求类

package com.prueba.http.request;

public class PruebaRequest {

    public String nombre;

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

}

响应类别

package com.prueba.https.response;

public class PruebaResponse {

    public String saludo;

    public String getSaludo() {
        return saludo;
    }

    public void setSaludo(String saludo) {
        this.saludo = saludo;
    }


}

控制器类

package com.prueba.https.controller;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import com.prueba.http.request.PruebaRequest;
import com.prueba.https.response.PruebaResponse;

@RestController
public class PruebaController {


    @PostMapping(value = "/PruebaHTTPS") 
    public Object PruebaController(@RequestBody PruebaRequest req) {
        PruebaResponse res = new PruebaResponse();
        res.setSaludo("Hola " +req.getNombre());
        return res;

    }

}

应用属性

server.port=8443

server.ssl.key-store = classpath:keystore.p12
server.ssl.key-store-password = pass
server.ssl.keyStoreType = PKCS12
server.ssl.keyAlias = tomcat

pom xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.prueba.https</groupId>
    <artifactId>PruebaHTTPS</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>PruebaHTTPS</name>
    <description>Pruebas HTTPS</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

我的项目结构

科胜

连接HTTP

更新

使用以下适用于我的spring版本的代码,但它会导致http请求出错:

package com.prueba.https;
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.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@ComponentScan
@Configuration
@EnableAutoConfiguration
public class WebsocketSourceConfiguration {

      @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(getHttpConnector());
        return tomcat;
      }

      private Connector getHttpConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(8080);
        connector.setSecure(false);
        connector.setRedirectPort(8443);
        return connector;
      }



}

HTTPS (8443)

HTTP(8443)

HTTP(8080)

为什么我不能指向 http: 8443 并将我重定向到 https?

共有1个答案

仉峻
2023-03-14

要将您的< code>HTTP请求重定向到< code>HTTPS请求,您需要添加以下配置:

@Bean
public EmbeddedServletContainerFactory servletContainer() {
  TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() {
      @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);
  return connector;
}

我希望这对你有用。

 类似资料:
  • 我正在尝试将所有http流量重定向到https。我尚未在服务器上安装SSL证书,并且正在使用cloudflare灵活SSL选项。 以下代码工作文件 但这让http://www.example.com转向了https://example.com 但是当我添加这个 重定向所有非www网址,如http://example.com到https://example.com 网站没有加载,并给我一个错误,说浏

  • 如何轻松配置嵌入式tomcat服务器,将所有http流量重定向到https?我在弹性负载平衡器后面的ec2实例上运行Spring Boot。我已经配置了ELB来为我处理ssl(这太棒了),它将X-FORWARDED-PROTO头设置为“https”。我想检测什么时候没有设置,并重定向用户,迫使他们使用https,如果他们还没有设置的话。 到目前为止,我已经尝试将以下内容添加到我的applicati

  • 问题内容: 我正在尝试构建一个URL缩短器,并且我希望能够在域之后立即采用任何字符并将它们作为变量url传递。所以举个例子 http://google.com/asdf 会成为 http://www.google.com/?url=asdf。 这是我现在拥有的mod_rewrite,但是我不断收到400错误的请求: 问题答案: 尝试替换为 编辑:尝试替换为

  • 我已经在.ebExtensions文件夹中用以下代码创建了一个配置文件 我确信aws会考虑我的配置,因为de ssl工作得很好。但http块不工作。没有重定向。 也许我的问题是关于重写EB的原始nginx配置,你知道如何实现这一点吗? 谢谢你

  • 我需要配置我的Tomcat 9服务器,将http重定向到https流量。 我尝试过: > < li> 对http端口使用连接器,并具有指向安全连接器的redirectPort属性。 在web.xml底部包括一个安全约束链接,它适用于其他不使用虚拟主机的Tomcat服务器 连接器 安全约束 服务器中的主机配置.xml < Li > https://example 2 . com-Works < Li

  • 我有和这个问题一样的问题,但不是在EC2环境中,只是简单地从命令行启动我的spring boot应用程序。我按照下面这个例子中的代码,成功地让我的应用程序在HTTPS上运行: 现在我可以在。 我希望会重定向到https。现在Chrome只是显示:“未收到数据”,这对用户不太友好。