5

我希望能够在客户端使用 Spring MVC 作为 REST 服务器和 AngularJS。

我有几个 REST 网址:

  • /休息/产品
  • /rest/products/{id}

我有几个 UI 网址:

  • /商店/产品
  • /shop/products/{id}

因为它是 AngularJS 在客户端做的伎俩,我只想能够将所有默认的 ui url(而不是其余的)重定向到 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 url 处理委托给 AngularJS。

我还希望如果用户在浏览器中写入错误的 url,Spring MVC 将在 index.html 文件上重定向他,它将是 AngularJS,它将在错误 ui 页面上进行重定向。我在网上看到过几个项目,只有一个 index.html 文件,但没有人处理这种错误情况。

我一直在努力尝试这个技巧,但我找不到解决方案。

所以我的问题是:我该怎么做?更一般地说,我对这个 Spring MVC-AngularJS 想要的配置有错吗?

非常重要:我使用没有 web.xml 的 Spring MVC 3.2 和 Tomcat 7.34(完整的 Servlet 3.0)

非常感谢。

4

4 回答 4

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。

在 Spring 中,您将基本上拥有三个请求映射

重定向所有其他请求:

@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;
}
于 2013-01-01T17:12:49.873 回答
0

我认为你可以编写一个拦截器,它允许一些已知的 URL,如/rest/ 、 /resources/、 /webjars/*以及任何其他 URL 重定向到index.html

于 2015-05-04T04:04:59.007 回答
0

尝试使用urlrewritefilter

这应该为您完成工作。您必须在 web.xml 中配置/添加它,以便处理每个 url,并且您可以操纵它以重定向到 index.html

于 2016-01-30T22:11:11.577 回答
0

我知道它有点晚了,但如果有人遇到同样的麻烦,这里是放在你的类路径 urlwrite.xml 中的 URL 过滤器示例

您可以设置要过滤的某些 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>
于 2016-11-17T10:07:51.030 回答