假设我的网站名称是: foo.com
当用户输入 foo.com 时,我想显示 index.html 。
当用户键入 foo.com/something 时,我希望服务器在控制器上捕获请求。
这是我在HomeController中所做的:
@Controller
public class HomeController {
@RequestMapping(value={"/"}, method=RequestMethod.GET)
public String getHome() {
return "index.html";
}
}
并且,CustomController应该捕获请求
@Controller
public class CustomController {
@RequestMapping(value={"/{custom}"}, method=RequestMethod.GET)
public String getCustom(@PathVariable String custom) {
// Do something here..
}
}
然而,它会抛出一个错误:循环视图路径[index.html]:将再次发送回当前处理程序URL [/index.html]。这是因为CustomController捕获了GET请求HomeController返回字符串后的 foo.com/index.html :index.html。
我做了这样的研究:
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
registry.addResourceHandler("/assets/**").addResourceLocations("classpath:/assets"); // My asset
registry.addResourceHandler("index.html").addResourceLocations("file:/index.html");
} // It's not working
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("forward:/" + FileNames.INDEX);
} // This also not working
}
在CustomController中将注释从@Controller更改为@RestController不是一个选项。
另外,我在项目中没有JSP文件 - 它们是普通的* .html文件。
我正在使用Spring 1.3.3版本,所以请帮帮我。
答案 0 :(得分:1)
此解决方案适用于 ui-router (AngularJS库)。此外,您必须更改 $ resourceProvider 设置:
// In your app module config
$resourceProvider.defaults.stripTrailingSlashes = false;
然后,在Spring服务器代码中,您可以这样做:
@RequestMapping(value = "/{custom:[^\\.]*}")
public String redirect(@PathVariable String custom) {
// Do something here...
return "forward:/";
}
在此链接找到解决方案:https://spring.io/blog/2015/05/13/modularizing-the-client-angular-js-and-spring-security-part-vii