我需要处理一些GET请求才能转发到多个Angular客户端。
https://example.com/web/index.html // Client 1 https://example.com/admin/index.html // Client 2
由于我不想使用碎片化的(#-ed)路径,因此/web变得相当麻烦。
#
/web
这是我目前 无法使用的 解决方案:
@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/**则整个过程将陷入无休止的循环并破坏服务器。
@RequestMapping
/web/**
我可能需要的是这样的表达式:
/web(/[^\\.]*)
这将导致
MATCH: /web/pricing MATCH: /web/specials/city MATCH: /web/specials/city/street NO MATCH: /web/index.html
但是,Spring不喜欢此正则表达式: /web(/[^\\.]*)
最后,这个问题归结为找到一种方法来匹配除静态资源以外的所有内容/web。
这是我最终要做的事情:
我将两个客户端都移到了一个子目录a/:
a/
static/a/web static/a/admin
此外,我实现了ForwardController这样的代码:
ForwardController
@Controller public class ForwardController { @RequestMapping(value = "/*", method = RequestMethod.GET) public String redirectRoot(HttpServletRequest request) { return "forward:/a/web/index.html"; } @RequestMapping(value = "/a/**/{path:[^.]*}", method = RequestMethod.GET) public String redirectClients(HttpServletRequest request) { String requestURI = request.getRequestURI(); if (requestURI.startsWith("/a/admin/")) { return "forward:/a/admin/index.html"; } return "forward:/a/web/index.html"; } }