Angular html5模式和Spring路由



我有一个问题,使用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部分中的其他元素使用该元素的信息。

最新更新