【问题标题】:Spring Boot-Angular - Entering Url in Address Bar results in 404Spring Boot-Angular - 在地址栏中输入 Url 导致 404
【发布时间】:2018-05-13 20:45:52
【问题描述】:

在基础知识方面需要帮助 - 我已经集成了 Angular 和 Spring Boot。 我制作了 Angular 应用程序的生产版本,并复制了 Spring boot 静态资源文件夹中的 6 个文件。

默认情况下,当我点击 localhost:8080 时 index.html 呈现为 Spring boot 自动将其注册为欢迎页面。

现在当我在 Angular 内部时,我可以通过 ANGULAR ROUTER 导航到不同的组件,并且 url 也在变化。

但是当我复制相同的 URL 例如 - localhost:8080/myTask 并在 url 地址栏中输入它会抛出 404 找不到资源。 因为它首先命中 Spring 控制器,并且由于没有映射它失败。

【问题讨论】:

  • 我也有类似的问题。将 angular dist 文件夹复制到 Spring boot 静态目录后,仅加载索引页面。但是在 app.routing.ts 中设置 useHash: true 修复了错误 404。

标签: java angular spring-boot


【解决方案1】:

在 Spring Boot 中扩展 WebMvcConfigurerAdapter 的类中,在 addViewControllers 方法中,你应该这样做

@Override
    public void addViewControllers(final ViewControllerRegistry registry) {
        super.addViewControllers(registry);
      registry.addViewController("/myTask").setViewName("forward:/");
 }

转发,所有请求,你可以registry.addViewController("/**").setViewName("forward:/");

更新感谢乔纳斯的建议。由于 WebMvcConfigurerAdapter 在 Spring 5.0 中已被弃用,因此可以通过扩展 WebMvcConfigurer 来实现上述逻辑

【讨论】:

【解决方案2】:
// the perfect solution(from jhipster)
@Controller
public class ClientForwardController {
    @GetMapping(value = "/**/{path:[^\\.]*}")
    public String forward() {
        return "forward:/";
    }
}

【讨论】:

    【解决方案3】:

    如果你不使用 Spring MVC(例如,你使用 Jersey),你也可以通过使用 javax.servlet.Filter 来解决这个问题:

    @Component
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public class AngularRoutingFilter implements Filter {
    
      @Override
      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = ((HttpServletRequest) request);
        String requestURI = httpServletRequest.getRequestURI();
    
        if (shouldDispatch(requestURI)) {
            request.getRequestDispatcher("/").forward(request, response);
        } else {
            chain.doFilter(request, response);
        }
      }
    
      @Override
      public void init(FilterConfig filterConfig) {}
    
      @Override
      public void destroy() {}
    
      private boolean shouldDispatch(String requestURI) {
        /* Exclude/Inlclude URLs here */
        return !(requestURI.startsWith("/api") || requestURI.equals("/"));
      }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2020-01-30
      • 2021-06-18
      • 1970-01-01
      • 2013-07-04
      • 1970-01-01
      • 2021-03-14
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      相关资源
      最近更新 更多