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

尽管使用@requestmapping(“**”),但仍在Spring Boot中提供静态内容

皇甫俊雅
2023-03-14

我感兴趣的是另一个。它是一个代理,将所有调用重定向到第一个调用。因此,当我调用http://localhost:8080/foo时,我的代理服务器将依次调用http://localhost:8090/foo。如果第一个服务器返回A,代理将返回{“proxied”:A,“someinformationaboutthiscall”:B}

我设法用一些可能不优雅但功能正常的代码来达到这一点,下面我给出了摘录。这里的关键是我使用@requestmapping(“**”)来实现这一点。下一步是设计一个界面,将使我的附加信息立即清晰,这基本上是这个项目的重点。如果删除所有@requestmapping("**“),它就可以正常工作。

现在我的问题是:在使用@requestmapping(“**”)之后,我无法提供静态内容(调用将重定向到不提供静态内容的另一个REST服务器)。如何配置Spring Boot/Spring MVC,在映射请求时忽略可用的静态内容资源,或者使PathResourceResolver优先于我的控制器?`或者我应该从另一个JVM/服务器提供我的静态内容?

提前感谢您的帮助!

感兴趣的编辑:在进行一些测试时,我发现如果使用@requestmapping("*“),静态内容会受到一些限制。

  • /index.html生成错误页(与直接在public中的任何静态内容一样)
  • /itf/index.html起作用(public/itfpublic的任何其他子目录中的任何文件都起作用)
  • /itf不起作用:Spring Boot似乎不知道其中有索引文件。我必须指定完整的URI,直到要显示的特定文件。

我也尝试了一些反匹配,但它不仅不起作用,而且感觉非常非常脏(整个项目可能不是最佳的,所以这说明了很多)。

注意:你可以在评论中建议更好的实现这一点的方法。请记住,虽然我总是对改进建议持开放态度,但这不是我的问题。

@RestController
public class ProxyController {

    @Value("${monitored.url.base}") // "http://localhost:8090"
    private String redirectBase;


    @RequestMapping(value = "**", method = {RequestMethod.POST, RequestMethod.PUT})
    public ProxiedResponse proxifyRequestsWithBody(HttpServletRequest request, @RequestHeader HttpHeaders headers, @RequestBody Object body) throws URISyntaxException {
        return proxifyRequest(request, headers, body);
    }

    @RequestMapping(value = "**")
    public ProxiedResponse proxifyRequestsWithoutBody(HttpServletRequest request, @RequestHeader HttpHeaders headers) throws URISyntaxException {
        return proxifyRequest(request, headers, null);
    }

    private ProxiedResponse proxifyRequest(HttpServletRequest request, @RequestHeader HttpHeaders headers, @RequestBody Object body) throws URISyntaxException {
        final RequestEntity<Object> requestEntity = convertToRequestEntity(request, headers, body);

        // call remote service
        final ResponseEntity<Object> proxied = restTemplate.exchange(requestEntity, Object.class);

        // Return service result + monitoring information
        final ProxiedResponse response = new ProxiedResponse();
        response.setProxied(proxied.getBody());
        // set additional information

        return response;
    }

    // Won't work properly for POST yet
    private <T> RequestEntity<T> convertToRequestEntity(HttpServletRequest request, HttpHeaders headers, T body) throws URISyntaxException {
        // Build proxied URL
        final StringBuilder redirectUrl = new StringBuilder(redirectBase).append(request.getRequestURI());
        final String queryString = request.getQueryString();
        if (queryString != null) {
            redirectUrl.append("?").append(queryString);
        }

        // TODO enhancement: transmit headers and request body to make this a real proxy
        final HttpMethod httpMethod = HttpMethod.valueOf(request.getMethod());
        return new RequestEntity<>(body, headers, httpMethod, new URI(redirectUrl.toString()));
    }
}
@Configuration // adding @EnableWebMvc did not solve the problem
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {

    private static class StaticResourcesHandlerInterceptor extends HandlerInterceptorAdapter {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            final String requestURI = request.getRequestURI();
            if (requestURI == null || "/".equals(requestURI) || "/index.html".equals(requestURI) || requestURI.startsWith("/assets")) {
                return super.preHandle(request, response, null);
            }

            return super.preHandle(request, response, handler);
        }
    }

    @Autowired
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new StaticResourcesHandlerInterceptor()).addPathPatterns("/**");
    }
}

暂时还没有答案

 类似资料:
  • null 我也尝试了一些反匹配,但它不仅不起作用,它也感觉非常非常脏(整个项目可能不是最优的,所以这是说了很多)。 注意:您可以在评论中建议实现这一点的更好方法。请记住,虽然我总是开放的改进建议,这不是我的问题。

  • 我无法访问静态内容(angular app),甚至无法访问简单的索引。来自spring boot的html文件。我一直收到404错误。Spring没有为我提供这些静态文件。自从升级到Spring Boot 2.2.4后,我就遇到了这个问题。我必须升级以应对Zip64问题。 我的application.properties里有这样一句话: 我也有自己的staticResourceConfigurat

  • 类似于另一个问题(参见过滤静态内容Jersey),我想从Jetty提供静态内容。在浩瀚的互联网上散布着几个类似的问题,但大多数都不涉及Guice,而那些涉及Guice的问题已经完全过时了。 我有一个现有的服务,使用泽西(1.12)和Guice(3)与以下: < code>MyGuiceConfig看起来像这样: 当我使用 时,我的服务按预期工作。但是,任何对静态内容的请求都会产生404。 如何在不

  • 问题内容: 我在两个不同的容器(Tomcat和Jetty)上部署了一个webapp,但是它们用于提供静态内容的默认servlet具有处理我要使用的URL结构的不同方式(详细信息)。 因此,我希望在web应用程序中包含一个小型servlet,以提供其自己的静态内容(图像,CSS等)。Servlet应该具有以下属性: No external dependencies Simple and reliab

  • 问题内容: 我正在探索Go的深度,并且我一直在尝试编写一个简单的Web应用程序来围绕所有内容。我正在尝试服务React.js应用程序。 下面是Go服务器的代码。我有默认的服务路线,效果很好。我正在努力允许将静态文件提供给该索引文件。尽管我需要静态提供JavaScript / CSS / Media文件,但我允许React App自己进行客户端路由。 例如,我需要能够将文件提供给React应用程序才

  • 问题内容: 我无法让Spring-boot项目提供静态内容。 我已经放在一个命名的文件夹下。在其中,我有一个名为的文件夹。当我打包应用程序并运行它时,它找不到我放在该文件夹中的图像。 我试图把静态文件中,并但没有任何工程。 如果我我可以看到文件在正确文件夹的jar中:例如,但是调用:http://localhost:8080/images/head.png,我得到的只是一个404 有什么想法为什么