当前位置: 首页 > 面试题库 >

heroku:spring boot仅使用https接入端点

景安翔
2023-03-14
问题内容

我在heroku上部署了Spring Boot
Java应用程序。我想确保只能通过https访问我的注册端点。到目前为止,我知道,heroku使用负载平衡器将每个https连接重定向到带有特殊标头(X-forwarded-
porto)的http。我在用

compile("org.springframework.boot:spring-boot-starter-security")

用于加密工具(哈希密码)。我将“ security.basic.enable”属性设置为false(实际上不知道在这种情况下是否重要。)。

尝试已经设置以下设置:

tomcat:
  remote_ip_header: x-forwarded-for
  protocol_header: x-forwarded-proto

在我的application.yml中

问题是,我如何才能强制仅通过https链接使用端点?对于http,它可能会返回404之类的内容。我正在使用gradle,很难找到使用它的参考。尝试了一些在google中找到的东西,但是没有用(或者我不知道如何正确实现它们…)。我仍然可以使用邮递员通过http访问端点。现在看起来像这样:

@Controller
@RequestMapping("/users")
public class AccountController {
    @Autowired
    private AccountRepository accountDao;

    @RequestMapping(value = "/register", method = RequestMethod.POST, consumes = "application/json")
    public ResponseEntity<Resource<Account>> createAccount(@RequestBody @Valid Account account) { ... }

问题答案:

实际上,我已经在此仓库https://github.com/fenrirx22/springmvc-https-
enforcer中
找到了一个解决方案(终于)。

创建了2个课程:

@Configuration
public class ApiConfig {
    @Bean
    public Filter httpsEnforcerFilter(){
        return new HttpsEnforcer();
    }
}

和:

public class HttpsEnforcer implements Filter {

    private FilterConfig filterConfig;

    public static final String X_FORWARDED_PROTO = "x-forwarded-proto";

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        if (request.getHeader(X_FORWARDED_PROTO) != null) {
            if (request.getHeader(X_FORWARDED_PROTO).indexOf("https") != 0) {
                response.sendRedirect("https://" + request.getServerName() + request.getPathInfo());
                return;
            }
        }

        filterChain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        // nothing
    }
}

奇迹般有效。



 类似资料:
  • 问题内容: 我最初的问题是如何为Django登录页面启用HTTPS,唯一的回应是建议我- 将整个站点设置为仅HTTPS。 鉴于我正在使用Django 1.3和nginx,将网站设为仅HTTPS的正确方法是什么? 一个回应提到了一个中间件解决方案,但有一个警告: Django在维护POST数据时无法执行SSL重定向。请整理你的视图,以便仅在GET期间进行重定向。 关于服务器故障的有关nginx重写为

  • 问题内容: 如何使用Jersey客户端API将GET请求发送到运行HTTPS协议的服务器。我可以使用任何示例代码吗? 问题答案: 这样构建您的客户 从此博客文章中窃取了更多详细信息:http : //blogs.oracle.com/enterprisetechtips/entry/consumption_restful_web_services_with 有关设置证书的信息,请参见以下已很好回答

  • 我想运行只使用HTTPS(8443)的嵌入式tomcat。我根本不想使用8080端口。有关于的想法吗? 谢谢

  • 我已经将Jetty 9.2HTTP/1.1+SSL服务器(嵌入式)升级到Jetty 9.3.0(v20150612)HTTP/HTTPS 2.0(SLL(TLS)-alpn-HTTP/2)。我使用JRE8(Oracle1.8.0Build45-B15)和Eclipse。 *通过JOAKIM的回答解决问题:解决方案见帖子末尾* 在升级之前,HTTP和HTTPS工作得很好,只要用Jetty9.3 Ja

  • 问题内容: 我有2个应用程序,一个是Servlet / Tomcat服务器,另一个是Android应用程序。 我想使用HttpURLConnection在两者之间发送和接收XML。 码: 现在,我需要使用SSL来发送XML以确保安全。 首先,我使用Java Keytool生成.keystore文件。 然后我将XML代码放在Tomcat的server.xml文件中以使用SSL 然后,将其更改为Htt

  • 我在Kubernetes集群中安装了Kubernetes NGINX入口 我在AWS EC2实例上部署了所有内容,经典负载均衡器位于入口控制器的前面。我可以用http端口访问服务,但不能用HTTPS访问它。 我从godaddy购买了一个有效的域,并从证书管理器获得了AWS SSL证书