Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 阻止Http访问api_Java_Spring_Spring Mvc_Spring Security_Https - Fatal编程技术网

Java 阻止Http访问api

Java 阻止Http访问api,java,spring,spring-mvc,spring-security,https,Java,Spring,Spring Mvc,Spring Security,Https,是否可以防止不使用https的请求调用get/post in代码 例如,我正在用java和spring实现一个restapi,如果调用者没有使用https,我想将http状态返回给调用者 /api/getBlah使用https将返回该项目,但是仅使用http将不起作用并返回相应的http状态。有几种不同的处理方法Web服务器处理在我看来,它是最常见的,并且充分利用了Web服务器和应用程序服务的优势 Web服务器处理 如上所述,部署Java web应用程序的常用方法是将web服务器(如apache

是否可以防止不使用https的请求调用get/post in代码

例如,我正在用javaspring实现一个restapi,如果调用者没有使用https,我想将http状态返回给调用者


/api/getBlah
使用https将返回该项目,但是仅使用http将不起作用并返回相应的http状态。

有几种不同的处理方法Web服务器处理在我看来,它是最常见的,并且充分利用了Web服务器和应用程序服务的优势

Web服务器处理

如上所述,部署Java web应用程序的常用方法是将web服务器(如apache或nginx)放在Java应用程序服务器(tomcat、wildfly、jetty等)前面。然后,web服务器将请求代理到应用服务器

在这样的设置中,您可以简单地返回静态响应或重定向用户。。这样,您就不需要从自己的Java应用程序返回任何特殊的内容。web服务器为您执行提升操作

应该注意的是(正如@Tom的回答),在API用例中,HTTP到HTTPS重定向不是最好的方法。这更常见

应用服务器独立servlet

在Java方面,基本上可以创建两个独立的web应用程序。第一个将配置为接收来自HTTP侦听器的请求,并提供正确的错误消息或重定向。另一个是您的主应用程序,配置为仅接收来自HTTPS侦听器的请求

同样,使用静态错误进行响应对于API来说是最好的

应用服务器单个应用程序

当servlet处理请求时,它将填充ServletRequest中的信息,包括关于请求是否安全的信息(使用HTTPS)。请参阅[ServletRequest documentation][2],特别是
isSecure()
方法。您可以在应用程序中检查ServletReest,以确定响应请求的适当方式

不要回答
您还可以简单地将Web服务器/应用程序服务器配置为不侦听HTTP请求。您将错过为用户提供合理错误的更改,但您将获得不允许通过HTTP进行任何请求的效果。

对于API服务器,我强烈建议您不要回答重定向

如果您确实回答了重定向,如果开发人员错误地使用了API的http版本,他将不会立即看到他使用了不安全的连接

如果您回答“400错误请求”、“401未经授权”或“405方法不允许”,并且正文解释仅允许https,那么开发人员将立即看到问题


简而言之,在API中回答重定向http=>https会鼓励不良做法

我会添加一个从http到https的Web服务器(apache,nginx)重定向,解决了problem@DZDomi是对的,,这类问题通常通过正确配置服务器以不允许通过http访问资源来解决。在API中回答重定向http=>https会鼓励错误做法并隐藏错误。此外,如果api请求包含机密信息,那么懒惰的开发人员就无法保护这些信息。公平地说,通常您会在网站级别看到HTTP->HTTPS重定向,强制执行不提供任何页面,并且用户始终与服务器交互。但我同意,这与API不同。方法保持不变,但我会调整答案。是的。HTTP=>HTTPS在浏览器环境中是有意义的,因为用户最终可以看到HTTP的存在或不存在(HST适用),但对于API请求,一旦代码编写并运行,没有人会再次检查它,并且大多数情况下HST将不适用……感谢@Tom的回复,你知道我如何在SpringJava中检测调用是否来自http或https吗?然后我可以在使用Http no时返回Http状态?