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

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

姬实
2023-03-14
    null

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

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

@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("/**");
    }
}

共有1个答案

薛烨霖
2023-03-14

您可以将路径拆分为一个通配符和一个命名的路径变量,该变量必须匹配一个负的前瞻正则表达式。

@requestmapping(“/{variable:(?!static).*}/**”)

然后,您可以使用@PathVariable String variable作为您的controller方法的参数,以获得变量的值,如果您需要传递它。

 类似资料:
  • 我感兴趣的是另一个。它是一个代理,将所有调用重定向到第一个调用。因此,当我调用http://localhost:8080/foo时,我的代理服务器将依次调用http://localhost:8090/foo。如果第一个服务器返回,代理将返回。 我设法用一些可能不优雅但功能正常的代码来达到这一点,下面我给出了摘录。这里的关键是我使用来实现这一点。下一步是设计一个界面,将使我的附加信息立即清晰,这基本

  • 我无法访问静态内容(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 有什么想法为什么