Spring MVC:如何将服务器未知URL映射到主应用程序页面?

时间:2014-01-15 17:08:14

标签: angularjs tomcat spring-mvc

我们使用angular-route将URL映射到模板。该应用程序以如下方式工作:我们正在从http://servername/appName导航到http://servername/appName/page1,浏览器上的网址会发生变化,模板会成功加载。

问题是当页面刷新(或直接访问http://servername/appName/page1)时,我们从服务器收到404错误。看起来默认处理程序不会将未知URL映射到默认应用程序页面。

我们如何让服务器返回所有这些angularjs URL的默认应用页面?

代码如下:

@Controller
public class HomeController {
    @RequestMapping("/")
    public String home() {
        return "/WEB-INF/views/nbcalendar.html";
    }
}

应用配置:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"com.appname.web"})
public class MvcConfiguration extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
}

3 个答案:

答案 0 :(得分:1)

您可以在web.xml配置中设置错误处理程序。注意!此web.xml在Servlet容器(E.G. tomcat)中配置您的应用程序,它不是Spring-MVC设置。

添加如下内容:

<error-page>
    <error-code>404</error-code>
    <location>/MY_HANDLER</location>
</error-page> 

MY_HANDLER要么是您的默认位置,要么是记录事件的jsp,然后转发到默认位置。

希望有所帮助。

答案 1 :(得分:1)

您可以在@RequestMapping中使用wildcard expressions来匹配您的应用及其所有子页面。

@RequestMapping("/**")
public String home() {
    return "/WEB-INF/views/nbcalendar.html";
}

答案 2 :(得分:0)

我能够通过将其他URL添加到家庭控制器来解决它:

@Controller
public class HomeController {

    private static String DEFUALT_PAGE = "/WEB-INF/views/main.jsp";
    @RequestMapping("/")
    public String home() {
        return DEFUALT_PAGE;
    }

    @RequestMapping("/welcome")
    public String welcome() {
        return DEFUALT_PAGE;
   }

    @RequestMapping("/cluster/{id}")
    public String cluster() {
        return DEFUALT_PAGE;
   }
}

这不是通用解决方案,需要手动添加任何新网址,但它运行良好