我有一个问题,使用angular html5模式路由与spring启动后端。当我使用ui router的$state.go()导航到不同的url时,应用程序工作得很好,但是当我试图进入另一个状态的url并直接跳转到它时,它无法正常加载。
我们使用了一个类似于这里详细介绍的解决方案(https://spring.io/guides/tutorials/spring-security-and-angular-js/),本质上是使用一个spring控制器将某些页面转发到基础url"/"。与我们的不同之处在于,我们使用一个基本的url, 'step',放在除了主页之外的每个页面的前面。然而,当我们直接导航到网站上的不同页面时,加载的每个资源都被转换为index.html文件(js, css等)。当我们查看网络请求时,由于某种原因,它在每个请求前都附加了'step' url(所以不是css/style.css,而是step/css/style.css)。
下面是我们的弹簧控制器的一个例子:
@Controller
public class ViewController {
@RequestMapping(value="/step/**")
public String forward() {
return "forward:/";
}
}
任何帮助将不胜感激,但请记住,我们已经研究了各种解决方案,如上述链接和其他几个有类似的解决方案。
结合线程和这个源代码,我们终于使它工作。在我们的例子中,没有任何子页面。也许它能帮助某人:
@RequestMapping(value = "/**/{id:[^\.]*}")
public String html5Forwarding() {
return "forward:/index.html";
}
开头的/**/
有助于将嵌套资源映射到该方法。
尝试返回您想要映射到的位置,而不是转发:
@Controller
public class MainViewController {
@RequestMapping("/")
public String indexPage() {
return "index";
}
@RequestMapping("/application/**")
public String apppplicationContext() {
return "index";
}
}
迟到的答案,无论如何我绊倒在同样的问题,在完全相同的上下文中,与资源文件有一个错误的url时,重新加载映射到一些前缀在Spring控制器上的url页面:
@RequestMapping(value = "/hello/{id:[\w-]+}")
public String forwardHello() {
return "forward:/index.html";
}
我的问题是,在index.html
文件我有:
<head>
<link rel='stylesheet' href='webjars/font-awesome/4.5.0/css/font-awesome.min.css'>
<link rel='stylesheet' href='webjars/bootstrap/3.3.4/css/bootstrap.min.css'>
...
<base href="/my-app/" />
</head>
一切都工作得很好,只要我导航一次索引页加载,但当从hello
上下文刷新页面时,例如:
http://example.com/my-app/hello/john
浏览器试图在路径中加载带有附加hello
的资源文件,例如
http://example.com/my-app/hello/webjars/...
解决方案是将<base href="/my-app/" />
放在头中的前面,以确保所有链接的资源都从这个基库加载。
引用W3Schools:
提示:将
标记作为元素内部的第一个元素,以便header部分中的其他元素使用该元素的信息。