【发布时间】:2019-06-13 02:33:12
【问题描述】:
我需要处理一些 GET 请求以便转发到多个 Angular 客户端。
https://example.com/web/index.html // Client 1
https://example.com/admin/index.html // Client 2
由于我不想为 /web 使用零散的 (#-ed) 路径,所以事情变得相当棘手。
这是我目前的不工作解决方案:
@Controller
public class ForwardController {
@RequestMapping(value = "/*", method = RequestMethod.GET)
public String redirectRoot(HttpServletRequest request) {
String req = request.getRequestURI();
if (req.startsWith("/admin/")) {
return this.redirectAdminTool(request);
}
return "forward:/web/index.html";
}
@RequestMapping(value = "/web/{path:[^.]*}", method = RequestMethod.GET)
public String redirectWeb(HttpServletRequest request) {
return "forward:/web/index.html";
}
@RequestMapping(value = "/admin/{path:[^.]*}", method = RequestMethod.GET)
public String redirectAdminTool(HttpServletRequest request) {
return "forward:/admin/index.html";
}
}
有了这个,工作就是访问例如
/web/pricing
但无法访问的是
/web/pricing/vienna
我可以通过浏览器访问/web/pricing,点击“刷新”,一切正常。但它不适用于/web/pricing/vienna。
现在,我无法弄清楚如何处理请求以及如何转发它们以使 /web/pricing/vienna 之类的子路径也能正常工作。
我有什么办法可以完成这项工作吗?
如果我将@RequestMapping 路径更改为/web/** 之类的路径,那么整个事情就会陷入无限循环并破坏服务器。
我可能需要的是这样的表达式:
/web(/[^\\.]*)
这会导致
MATCH: /web/pricing
MATCH: /web/specials/city
MATCH: /web/specials/city/street
NO MATCH: /web/index.html
但是,Spring 不喜欢这个正则表达式:/web(/[^\\.]*)
最后这个问题归结为找到一种方法来匹配除了/web下面的静态资源之外的所有东西。
【问题讨论】:
-
你也许可以用 UrlRewriteFilter 做到这一点 - tuckey.org/urlrewrite
-
@GreyBeardedGeek 嗯,这个解决方案可能是我最后的手段,但如果可能的话,我想避免这样做。毕竟这是一个非常小的问题,可以用一个简单的正则表达式来解决,但似乎
@RequestMapping在这方面受到限制,或者我在文档中找不到相关部分。
标签: regex angular spring spring-boot