一尘不染

Spring控制器中的圆形视图

spring-boot

我正在尝试在Spring控制器中提供静态资源。我有一个index.html文件,应该将其返回到每个请求。我的控制器是:

@Controller
public class IndexController {
    @RequestMapping(value = "/**", method = RequestMethod.GET)
    public String index() {
        return "index.html";
    }
}

我也添加了资源处理程序:

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/**").addResourceLocations("classpath:/");
}

但最后我有以下例外:

循环视图路径[/index.html]:将再次分派回当前处理程序URL
[/index.html]。检查您的ViewResolver设置!(提示:由于默认视图名称的生成,这可能是未指定视图的结果。)

我了解,在我的配置中,所有请求都将由Spring控制器处理。

因此,当我请求http://localhost/someText该请求时,例如该请求将由我的控制器处理,然后我的控制器将重定向发送到//localhost/index.html,该请求转到Spring的请求DispatcherServlet,然后再次重定向到我的控制器,从而导致上述异常。

我也已经尝试了一些选项:制作Web过滤器,该过滤器将处理我的请求,/index.html而不是通过spring
servlet,而是通过默认情况下的处理(对于我DefaultServlet的undertow而言),但这是不可能的,因为我的应用程序未打包为war和index.html文件位于/src/java/resources

实际上,我发现主要的问题是在spring的DispatcherServlet处理程序中,我的request(//localhost/index.html)被检测为控制器,而不是资源处理程序。

protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
    for (HandlerMapping hm : this.handlerMappings) {
        if (logger.isTraceEnabled()) {
            logger.trace(
                        "Testing handler map [" + hm + "] in DispatcherServlet with name '" + getServletName() + "'");
        }
        HandlerExecutionChain handler = hm.getHandler(request);
        if (handler != null) {
            return handler;
        }
    }
    return null;
}

因此,也许有一种方法可以更改HandlerMapping的顺序,以使资源映射比端点映射器具有更高的优先级?或者是否可以排除/index.html来自控制器的请求以能够使用spring资源处理程序处理它?


阅读 289

收藏
2020-05-30

共1个答案

一尘不染

我已经通过以下方式弄清楚了:我定义了请求,应该在某些确切的控制器中对其进行处理。然后我创建了过滤器,该过滤器将所有其他请求添加到路径中的前缀“ /
root”。我创建了一个控制器,该控制器处理为我的index.html服务的所有“ / root / **”请求。

因此,基本上,当我请求“ / api / someApi”时,它将带有API内容发送到我的控制器。但是,当我请求“ / someStuff
/”时,在过滤器中它变为“ / root / someStuff /”,因此它返回到我的控制器,返回“ /index.html”。

2020-05-30