Spring Boot应用程序中多个Angular客户端的RequestMapping问题

时间:2019-01-18 19:47:54

标签: regex angular spring spring-boot

我需要处理一些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之下的静态资源以外的所有内容。

2 个答案:

答案 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";
}

}