我希望能够在客户端使用Spring MVC作为REST服务器和AngularJS。
我有几个REST的网址:
我有几个UI的网址:
由于AngularJS在客户端执行该技巧,我只想将所有默认的UI(而不是其余的)重定向到AngularJS使用的index.html文件。
因此,在Spring MVC配置中,我希望能够做到这样的事情:
@EnableWebMvc
@Configuration
@ComponentScan(basePackages = "com.mypackage.web")
public class WebAppConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/**").setViewName("index");
}
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/");
resolver.setSuffix(".html");
return resolver;
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
有了这个,我想将所有处理的UI网址委托给AngularJS。
我还想要如果用户在浏览器中写了一个坏URL,他将被Spring MVC重定向到index.html文件上,它将是AngularJS,它将在错误页面上进行重定向。我在Web上看到了几个带有单个index.html文件的项目,但没有人处理这个错误情况。
我一直在努力尝试这个技巧但我无法找到解决方案。
所以我的问题是:我怎么能这样做?更一般地说,我对这个Spring MVC-AngularJS想要的配置有误吗?
非常重要:我使用没有web.xml的Spring MVC 3.2和Tomcat 7.34(完整的Servlet 3.0)
非常感谢。
答案 0 :(得分:0)
也许有可能通过$routeProvider来解决它:
$routeProvider.when('/redirect/:redirectParams', {templateUrl: 'partials/homePartial', controller: redirectController});
$routeProvider.when('/home', {templateUrl: 'partials/homePartial', controller: homeController});
$routeProvider.when('/someRoute', {templateUrl: 'partials/somePartial', controller: someController});
$routeProvider.when('/error/', {templateUrl: 'partials/errorPartial', controller: errorController});
$routeProvider.when('/error/:errorMessage', {templateUrl: 'partials/errorPartial', controller: errorController});
$routeProvider.otherwise({redirectTo: '/error'})
当找不到路线时,只需让$routeProvider
重定向到错误页面。
修改强>
我在上面的例子中添加了一个redirectController。此控制器将阅读$routeParams
,在这种情况下为$routeParams.redirectParams
,并使用$location将路由更改为/error
。
Spring只是重定向到http://host:port/index.html/#/redirect/error=blabla
。您可以而且应该对此进行微调并支持多个routeParams。
在春天你基本上会有三个request mappings:
重定向所有其他请求:
@RequestMapping(value = "{path}", method = RequestMethod.GET)
public String redirect(@PathVariable String path) {
String route = null;
if (path.equals("/") || path.startsWith("/index.html")) {
// load index.html
} else {
route = "redirect:/index.html/#/redirect/" + path;
}
return route;
}
答案 1 :(得分:0)
我认为你可以写一个拦截器,它允许一些已知的网址,例如 / rest / ,/ resources / ,/ webjars / * 和对于任何其他网址重定向到 index.html 。
答案 2 :(得分:0)
尝试使用urlrewritefilter
这应该为你工作。您必须在web.xml中配置/添加它,以便处理每个URL,您可以将其操作以重定向到index.html
答案 3 :(得分:0)
我知道它有点晚了但是如果有人遇到同样的问题,请在你的类路径urlwrite.xml中放入URL过滤器样本
您可以设置要过滤的某些网址的重定向。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 4.0//EN"
"http://www.tuckey.org/res/dtds/urlrewrite4.0.dtd">
<!-- Configuration file for UrlRewriteFilter http://www.tuckey.org/urlrewrite/ -->
<urlrewrite>
<rule>
<note>
The rule means that requests to /test/status/ will be redirected
to
/rewrite-status
the url will be rewritten.
</note>
<from>/index.ipxs/directory</from>
<to type="redirect">/index.ipxs/marketplace</to>
</rule>
<rule>
<from>/index.ipxs/faq</from>
<to type="redirect">/index.ipxs/marketplace</to>
</rule>
<rule>
<from>/index.ipxs/marketplace</from>
<to type="redirect">/iPlexus/index.ipxs</to>
</rule>
</urlrewrite>