我需要处理一些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
之下的静态资源以外的所有内容。
答案 0 :(得分:0)
这就是我最终要做的事情:
我将两个客户端都移到了子目录{0: 5, 1: 4, 4: 3, 2: 3}
[5, 4, 3, 0, 3]
:
a/
此外,我实现了这样的static/a/web
static/a/admin
:
ForwardController
答案 1 :(得分:-1)
子路由将不起作用,因为需要先加载主索引才能获取所有路由。 一种解决方法是,每当服务器端未找到路径时,都将重定向到主索引:
@Controller
@RequestMapping("/error")
public class ErrorHandlerController extends AbstractErrorController {
private static final String ROOT_PATH = "/";
public ErrorHandlerController(ErrorAttributes errorAttributes) {
super(errorAttributes);
}
@RequestMapping
public void errorHtml(HttpServletRequest request,
HttpServletResponse response) throws IOException {
if(HttpStatus.NOT_FOUND.equals(getStatus(request))) {
response.sendRedirect(ROOT_PATH);
}
}
@Override
public String getErrorPath() {
return "error";
}
}