【问题标题】:Spring MVC: How to map server unknown URLs to the main application page?Spring MVC:如何将服务器未知 URL 映射到主应用程序页面?
【发布时间】:2014-02-04 07:10:24
【问题描述】:

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

问题是当页面刷新(或直接访问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();
    }
}

【问题讨论】:

    标签: angularjs tomcat spring-mvc


    【解决方案1】:

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

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

    【讨论】:

    • 试过了,但不知何故它创建了一个无限循环。不知道为什么
    【解决方案2】:

    我能够通过向家庭控制器添加额外的 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;
       }
    }
    

    这不是通用解决方案,需要手动添加任何新 URL,但效果很好

    【讨论】:

      【解决方案3】:

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

      添加类似:

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

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

      希望对您有所帮助。

      【讨论】:

      • 谢谢!会尝试,但没有 Spring MVC 内置方法吗?
      • Tomcat 处理请求,然后在请求有效时分派给 Spring MVC。因此,处理 404 错误是 Servlet 容器的责任(或者像 Apache 这样的 Web 服务器就是前端进程)。您的 Web 应用程序可能包含 Spring MVC 控制器 servlet 和非 Spring servlet。因此,您希望 Web 应用程序而不是 Spring 来处理像 404 这样的 http 异常。
      猜你喜欢
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 1970-01-01
      相关资源
      最近更新 更多