Я пытаюсь изменить сервер Jetty с сервлетом (RootResource.java), который каким-то образом волшебным образом подхватывает и использует:
@Singleton
@Path("/")
public class RootResource {
@Context
private ServletContext servletContext;
@GET
@Path("react-client/{path: .*\\..+$}")
public Response serveReactClientContent(@Context HttpServletRequest httpServletRequest) {
// This doesn't work, a resolved relative resource is not relative
// to the /react-client base. See description of problem.
final String pathToResource = httpServletRequest.getRequestURI();
return serveStaticContent(pathToResource);
}
@GET
@Path("react-client/{path: .*$}")
public Response serveReactClientIndexPage(@Context HttpServletRequest httpServletRequest) {
return serveStaticContent("/react-client/index.html");
}
private Response serveStaticContent(String pathToResource) {
final String type = this.servletContext.getMimeType(pathToResource);
final Response.ResponseBuilder response = Response.ok(servletContext.getResourceAsStream(pathToResource)).type(type);
return response.build();
}
}
Идея состоит в том, чтобы перевести GET-запрос на react-client/some/path
и верните содержимое react-client/index.html
.По сути, заставить Jetty вести себя как сервер веб-приложений, использующий маршрутизацию на стороне клиента.
Проблема, с которой я сталкиваюсь, заключается в том, что относительные пути в index.html
работают, только если путь имеет глубину на один уровень например react-client/products
.
<script src="./webapp.js"></script>
В этом случае файл javascript выше в index.html найден, потому что webapp.js
- это файл, который существует в react-client/webapp.js
.
Как толькокогда я пытаюсь найти более глубокую ссылку, например react-client/products/97357361
, которая не работает, когда сервлет пытается найти webapp.js
в react-client/products/webapp.js
, который не существует.
Как я могу сделать так, чтобы он всегда запрашивал ресурс, как будто он из/react-client
?Спасибо