Java Spring框架:HTTP选项返回所有方法(get、put、post、delete、trace、head、OPTIONS)

Java Spring框架:HTTP选项返回所有方法(get、put、post、delete、trace、head、OPTIONS),java,spring,tomcat,servlets,spring-security,Java,Spring,Tomcat,Servlets,Spring Security,我编写了一个SpringWeb应用程序。除了一件事,其他都很可靠。应用程序返回一个HTTP选项请求,其响应为“允许:GET、HEAD、POST、PUT、DELETE、OPTIONS”,但事实并非如此,只允许GET和POST。其他操作(GET和POST除外)返回“操作不受支持”错误405以及服务器名称和版本…等。安全团队不喜欢服务器的所有详细信息都返回“不支持”错误消息 我花了很多时间试图覆盖该错误页或为405引入自定义错误页。。。但我没有成功。 我花了一整天的时间试图禁用HTTP选项。没有成功。

我编写了一个SpringWeb应用程序。除了一件事,其他都很可靠。应用程序返回一个HTTP选项请求,其响应为“允许: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可以忽略它们,或者不提供关于我的服务器的内部信息


谢谢

您可以注册并使用一个拦截程序,该拦截程序将捕获对应用程序的所有请求,如果该方法不是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;
        }
    }


}
要注册拦截器,请将其添加到SpringXML配置文件中

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

您可以注册并使用
拦截器
,该拦截器将捕获对应用程序的所有请求,如果该方法不是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;
        }
    }


}
要注册拦截器,请将其添加到SpringXML配置文件中

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

您可以注册并使用
拦截器
,该拦截器将捕获对应用程序的所有请求,如果该方法不是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;
        }
    }


}
要注册拦截器,请将其添加到SpringXML配置文件中

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

您可以注册并使用
拦截器
,该拦截器将捕获对应用程序的所有请求,如果该方法不是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;
        }
    }


}
要注册拦截器,请将其添加到SpringXML配置文件中

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


非常感谢!你让我很开心。它适用于除选项外的所有操作。对于选项,我必须在web.xml中添加以下DispatchOptions请求true,它的效果非常好。你太棒了!!在myInterceptor.java中,我创建了一个405.htm页面,并将response.sendredirect()发送到该页面,而不是提供一些服务器信息的默认禁止页面,如下所示:response.sendredirect(“405.htm”);非常感谢!你让我很开心。它适用于除选项外的所有操作。对于选项,我必须在web.xml中添加以下DispatchOptions请求true,它的效果非常好。你太棒了!!在myInterceptor.java中,我创建了一个405.htm页面,并将response.sendredirect()发送到该页面,而不是提供一些服务器信息的默认禁止页面,如下所示:response.sendredirect(“405.htm”);非常感谢!你让我很开心。它适用于除选项外的所有操作。对于选项,我必须在web.xml中添加以下DispatchOptions请求true,它的效果非常好。你太棒了!!在myInterceptor.java中,我创建了一个405.htm页面,并将response.sendredirect()发送到该页面,而不是提供一些服务器信息的默认禁止页面,如下所示:response.sendredirect(“405.htm”);非常感谢!你让我很开心。它适用于除选项外的所有操作。对于选项,我必须在web.xml中添加以下DispatchOptions请求true,它的效果非常好。你太棒了!!在myInterceptor.java中,我创建了一个405.htm页面,并将response.sendredirect()发送到该页面,而不是提供一些服务器信息的默认禁止页面,如下所示:response.sendredirect(“405.htm”);