java - Spring framework : HTTP OPTIONS returning all METHODS (get, put, post, delete, trace, head, options)

标签 java spring tomcat servlets spring-security

我写了一个 spring web 应用程序。除了一件事外,它非常坚固。应用程序返回一个 HTTP OPTIONS 请求,响应为“允许:GET、HEAD、POST、PUT、DELETE、OPTIONS”,但事实并非如此,仅允许 GET 和 POST。其他操作(GET 和 POST 除外)返回“不支持的操作”错误 405 以及服务器名称和版本...等。安全团队不喜欢服务器的所有详细信息都返回“不支持”错误消息这一事实。

我花了很多时间试图覆盖该错误页面或为 405 引入自定义错误页面……但我没有成功。 我花了一整天的时间试图禁用 HTTP 选项。没有成功。 再说一个细节,我运行 curl 语句来测试:

curl "http://localhost:8080/webappX/welcome.htm" -X PUT -v

我的应用返回:

HTTP Status 405 - Request method 'PUT' not supported
Tomcat/6.0...etc 

由于此数据(tomcat 版本、服务器信息和响应元数据)可能被用于安全攻击,我如何创建一个自定义 405 页面来隐藏我的服务器的详细信息并提供一个非常小的错误页面? 或者我如何禁用 PUT、DELETE、TRACE、OPTIONS、HEAD,以便 tomcat 可能只是忽略它们或不提供有关我的服务器的内部信息。

谢谢

最佳答案

您可以注册并使用一个 Interceptor 来捕获对应用程序的所有请求,如果方法不是 GET/POST,只需重定向到您选择的错误页面/发送错误响应。

public class MyInterceptor extends HandlerInterceptorAdapter{

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        if (!request.getMethod().equalsIgnoreCase("POST") && !request.getMethod().equalsIgnoreCase("GET")) {
            // Not a POST/GET - send error and return false
            response.sendError(HttpServletResponse.SC_FORBIDDEN, "Unauthorized Request");
            return false;
        } else {
            return true;
        }
    }


}

要注册拦截器,请将其添加到您的 spring xml 配置文件中

<mvc:interceptors>
<mvc:interceptor>
    <mvc:mapping path="/**" />
    <bean class="your.package.MyInterceptor" />
</mvc:interceptor>
</mvc:interceptors>

关于java - Spring framework : HTTP OPTIONS returning all METHODS (get, put, post, delete, trace, head, options),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23412463/

相关文章:

java - 如何从 Polar 心率监测器获取正确的值

java.lang.NoClassDefFoundError : in eclipse maven 错误

java - Spring boot应用程序无法启动,可能是数据库连接问题

java - @PostConstruct sleep 时不会触发 ContextClosedEvent

java - 取消以前的请求服务器端

java - 如何修复 Race-condition, created duplicate class 错误

java - 使用 com.sun.net.httpserver.HttpServer 时不会调用 ServletContextListener

java - 如何将一个目录中的xml文件复制到另一个目录

Java从二进制结构化文件中读取错误的值

Java:获取键集值