Angular项目集成Spring Boot Tomcat服务器后路由失效求助
我来帮你搞定这个问题!这个情况在Angular单页应用(SPA)部署到Spring Boot后端时非常常见——在Angular CLI环境下正常,是因为dev server会自动把所有前端路由请求转发到index.html,但Spring Boot默认不会这么做,当你直接访问/op或/biologusers时,后端会把这些路径当作后端接口去匹配,找不到就返回404。下面给你两个可行的解决方案:
这个方案最简单,只需要修改Angular的路由配置,启用哈希模式,让后端服务器不解析路由路径的哈希部分,直接交给Angular处理。
修改你的Angular路由配置代码,在RouterModule.forRoot方法中添加useHash: true参数:
import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { RouterModule, Routes} from '@angular/router'; import { HttpModule } from '@angular/http'; import { AppComponent } from './app.component'; import { ListUserComponent } from './components/list-user/list-user.component'; import { UserFormComponent } from './components/user-form/user-form.component'; import { UserService } from './shared_service/user.service'; import { ListBioLogUserComponent } from './components/list-bio-log-user/list-bio-log-user.component'; const appRoutes:Routes=[ {path:'', component:ListUserComponent}, {path:'op', component:UserFormComponent}, {path:'biologusers', component:ListBioLogUserComponent} ]; @NgModule({ declarations: [ AppComponent, ListUserComponent, UserFormComponent, ListBioLogUserComponent ], imports: [ BrowserModule, HttpModule, // 添加useHash: true启用哈希路由 RouterModule.forRoot(appRoutes, {useHash: true}) ], providers: [UserService], bootstrap: [AppComponent] }) export class AppModule { }
修改完成后,重新执行ng build --prod打包,把dist目录下的文件放到Spring Boot的resources/static目录,重启服务后,访问路径会变成http://你的域名/#/op和http://你的域名/#/biologusers,这时就能正常访问了。
如果你不想用哈希前缀的路由,可以在Spring Boot中添加一个控制器,把所有前端路由的GET请求转发到index.html,让Angular接管路由处理。
创建一个名为WebController的控制器类:
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class WebController { // 匹配你的前端路由路径 @GetMapping({"/op", "/biologusers", "/"}) public String forwardToIndex() { return "forward:/index.html"; } // 通配符匹配所有非静态资源的请求(避免转发js、css、图片等文件) @GetMapping("/**/{path:[^\\.]*}") public String forwardAllRoutes() { return "forward:/index.html"; } }
这个控制器会拦截所有不带文件后缀(比如.js、.css)的GET请求,把它们转发到index.html,这样Angular就能正确处理这些前端路由了。
额外注意事项
如果你的Spring Boot应用部署在特定上下文路径下(比如http://你的域名/my-app),打包Angular时需要指定base href,避免资源路径错误:
ng build --prod --base-href /my-app/
内容的提问来源于stack exchange,提问作者Jagadeeshwaran Kuppuraj

