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-Data-Jpa---可嵌入对象和元素集合的使用