Spring Boot-Angular - 在地址栏中输入 Url 导致 404

Posted

技术标签:

【中文标题】Spring Boot-Angular - 在地址栏中输入 Url 导致 404【英文标题】:Spring Boot-Angular - Entering Url in Address Bar results in 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。 【参考方案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 来实现上述逻辑

【讨论】:

酷哥 立即回答。您能否指导我在哪里可以阅读所有这些信息。我想要更多关于这个和 Spring 安全性(过滤器链)的知识。想要更清楚地了解基础知识。 您可以在以下链接中探索更多内容docs.spring.io/spring-boot/docs/current/reference/html/…spring.io/guides/gs/securing-web。如果你觉得我的回答很有用的话,那就太好了 很好的答案,正是能够从 Spring Boot 实际提供 Angular 代码所需要的!谢谢孩子! 你也可以使用@Configuration public class AngularRedirectConfig implements WebMvcConfigurer @Override ... ,因为WebMvcConfigurerAdapter在Spring 5.0中被弃用了:docs.spring.io/spring-framework/docs/current/javadoc-api/org/…【参考方案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("/"));
  


【讨论】:

以上是关于Spring Boot-Angular - 在地址栏中输入 Url 导致 404的主要内容,如果未能解决你的问题,请参考以下文章

Spring 源码下载地址

Spring学习

学习Spring-Data-Jpa---可嵌入对象和元素集合的使用

spring boot 修改连接地址和端口

如何在运行时获取 SPRING Boot HOST 和 PORT 地址?

Spring Boot# Spring Boot项目启动时,打印端口号项目名访问地址