我在控制器中遇到了一个方法.这个id是什么:.+ ??
@RequestMapping(value="/index/{endpoint}/{type}/{id:.+}", method=RequestMethod.POST, consumes=kContentType, produces=kProducesType)
@ResponseBody
public String indexData(@PathVariable(value="endpoint") String endpoint, @PathVariable(value="type") String type, @PathVariable(value="id") String id, @RequestBody String body, HttpServletRequest request) {
logger.debug("In web controller for endpoint " + endpoint);
return indexController.indexData(endpoint, type, id, body, getSecurityContextProvider(request));
}
Run Code Online (Sandbox Code Playgroud) 我有一个使用 Angular 制作的简单前端应用程序。所有路由均由 Angular 处理,因此我希望 Spring boot 将所有页面流量转发到,"/"以便 Angular 路由可以处理它们。
stackoverflow 中已经有一些已知的答案。他们是:
但它们都不再工作了,因为从Spring Framework 5.3 及更高版本开始,它们 AntPathMatcher已被PathPattern. PathPattern与语法兼容,AntPathMatcher但以下内容除外:
仅允许在模式末尾支持多段匹配的“**”。在为给定请求选择最接近的匹配时,这有助于消除大多数歧义原因。
所以这不再起作用:
// Match everything without a suffix (so not a static resource)
@RequestMapping(value = "/**/{path:[^.]*}")
public String redirectAngularRoutes() {
return "forward:/";
}
Run Code Online (Sandbox Code Playgroud)
那么从 Spring Framework 5.3 开始,最好的方法是什么?
我们是否指定每个角度路由及其forward如下所示"/",或者还有其他替代方案?
@RequestMapping({ "/help/**","/view/**","/admin/**" })
public String redirectAngularRoutes() {
return "forward:/";
}
Run Code Online (Sandbox Code Playgroud) 我的问题与这个已经被提出和回答的问题非常相似,但不是100%最新的。
我们使用 Chris Gaskill 的解决方案相当长一段时间,它非常适合我们,因为我们想要重定向包含多个路径段的请求(即/foo/bar)
从 Spring Boot 2.4 开始,Boot 使用PathPatternParser代替AntPathMatcher,其中前者不再支持**模式的开头(请参阅文档)。
是否有其他解决方案来获得相同的行为?您使用什么将所有与其他内容不匹配的请求重定向到index.htmlAngular 应用程序?
这是转发请求的控制器的代码。
@Controller
class SpaRoutingController {
@GetMapping("/**/{path:[^\\.]*}", headers = "X-Requested-With!=XMLHttpRequest")
fun forward(): String? {
return "forward:/"
}
}
Run Code Online (Sandbox Code Playgroud) 我在本教程之后成功地将我的Angular2应用程序与Spring Boot后端集成,将已编译的JS资源放到/ ui子目录中.基本上一切正常,Angular2应用程序可以通过appname/ui URL访问.
但是,我想知道是否有办法告诉Spring'传递' / ui路径的子网,因为当前Spring拦截了每个请求目标/ ui/*,阻止Angular2路由器正确导航到/ ui路径下的资源.
目前,我只在我的一个控制器中有这个映射:
@RequestMapping(value = "/ui")
public String uiIndex() {
return "/ui/index.html";
}
Run Code Online (Sandbox Code Playgroud)
有了这个,接口正确地显示在/ ui,但是当我直接从浏览器中解决它时,Spring会向我发送错误和404 .Angular2应用程序内部的路由器导航工作正常.
编辑
我正在使用此配置将已编译的Angular2资源从target/ui添加到static/ui文件夹(我的项目使用maven构建):
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<includes>
<include>*.properties</include>
<include>templates/*.*</include>
</includes>
</resource>
<resource>
<directory>target/ui</directory>
<targetPath>static/ui</targetPath>
</resource>
Run Code Online (Sandbox Code Playgroud)
要明确的是,唯一的问题是,当我在浏览器中输入像/ ui/home/settings这样的URL时,Spring会拦截请求并抛出错误.我可以愉快地导航到/ ui,然后导航到Angular上下文中的/ home/settings.