2015-08-28 71 views
2

我有一个使用角度html5模式进行路由的问题,使用弹簧引导后端。当我使用ui路由器的$ state.go()导航到不同的url时,应用程序工作正常,但是当我尝试输入不同的状态的url并直接转到它时,它无法正确加载。Angular html5模式和弹簧路由

我们使用了类似于此处详述的解决方案(https://spring.io/guides/tutorials/spring-security-and-angular-js/),本质上使用弹簧控制器将某些页面转发到基本URL“/”。与我们的不同之处在于,我们使用基本网址“步骤”将每个页面放在首页之前。但是,当我们直接导航到我们网站中的其他页面时,所加载的每个资源都会变成我们的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:/"; 
    } 
} 

任何帮助,将不胜感激,但请记住,我们已经调查了各种解决方案已经如提到的链接和一些其他具有类似的解决方案。

回答

0

,请返回要映射它而不是向前:

@Controller 
public class MainViewController { 

    @RequestMapping("/") 
    public String indexPage() { 
     return "index"; 
    } 

    @RequestMapping("/application/**") 
    public String apppplicationContext() { 
     return "index"; 
    } 
} 
+0

你能详细说明一下吗?我尝试过使用“/ ** /”,但是我最终在一个无限循环中返回“index”,然后再次使用“/WEB-INF/views/index.html”调用控制器,有没有什么方法可以让我有一个带“/ **”的控制器,排除任何以“/ WEB-INF”开头的东西?我是否必须将所有内容都粘贴到“/ application”中? – Craig

0

迟到的回答,反正我绊倒了同样的问题,在完全相同的情况下,你,与具有错误的资源文件网址重装上在春节控制器映射到某一前缀的网址的页面时:

@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

提示:把< base>标记作为元素中的第一元件,从而在头部分的其他元件使用来自该元素的信息。

1

结合线程和this source我们终于得到它的工作。在我们的情况下,没有任何子页面。也许这可以帮助别人:

@RequestMapping(value = "/**/{id:[^\\.]*}") 
public String html5Forwarding() { 
    return "forward:/index.html"; 
} 

在一开始/**/有助于嵌套的资源映射到这个方法。