Wildfly Swarm RESTeasy скрывает webapp/index.html

Я работаю над проектом на основе Wildfly Swarm. Проблема, с которой я сталкиваюсь в настоящее время, заключается в том, что RESTeasy скрывает мой index.html (и другие файлы html), которые размещены ниже /webapp, поскольку RESTeasy прослушивает на корневом уровне.

Мое основное приложение:

@ApplicationPath("/")
public class XYZnlineApplication extends Application {
}

Один из моих ресурсов:

@Path("protected/api/admin")
public class AdminResource {
    @GET
    @Path("public/api/offer/reduced")
    @Produces("application/json")
    public List<XYZ> getXYZ() {
        ...
    }

    @GET
    @Path("protected/api/offer/full")
    @Produces("application/json")
    public List<XYZ> getAllXYZ() {
        ...
    }
}

Дело в том, что. Если я запускаю свое приложение wildfly swarm и получаю доступ к одной из указанных выше конечных точек, все работает нормально (например, http://localhost:8080/app/public/api/offer/reduced)

Но если я хочу получить доступ к одному из моих html-файлов (например, login.html), которые находятся непосредственно под /webapp, я получаю 404, хотя файл упакован правильно (например, при попытке доступа к http://localhost:8080/app/login.html). Итак, на мой взгляд, происходит то, что RESTeasy скрывает этот html-файл, потому что он прослушивает корень (/).

Поскольку первая часть моего URL-адреса — это контекст (который вводится прокси-сервером), я не могу установить ничего, кроме root (/), в качестве ApplicationPath в моем XYZApplication.

У вас есть идеи, как я могу решить эту проблему?

Заранее большое спасибо за вашу помощь.


person mooonli    schedule 19.07.2017    source источник
comment
Если вы не можете установить другой ApplicationPath, это усложняет задачу. Не могли бы вы поднять проблему с простым проектом, и мы можем посмотреть, issues.jboss.org/browse/ РОЙ   -  person Ken    schedule 19.07.2017


Ответы (1)


Вам нужно будет изменить ApplicationPath на что-то вроде «/services» или «/svc» или что-то другое, что вам подходит. В конечном итоге вам необходимо разделить пространство имен URL-адресов между статическими ресурсами и службами. Вам не нужно беспокоиться о контексте при указании ApplicationPath.

Основное редактирование:
Ваш комментарий действительно объясняет, что происходит. Я не уверен, какой именно тип безопасности вы используете, но в конечном итоге вам, вероятно, понадобится какой-то фильтр перед вашими службами. У меня было бы что-то вроде:

@Provider
@Priority(Priorities.AUTHENTICATION)
@PreMatching
public class AuthFilter implements ContainerRequestFilter {
    @Context
    private HttpServletRequest httpServletRequest;

    @Context
    private HttpServletResponse httpServletResponse;

    @Override
    public void filter(ContainerRequestContext containerRequestContext) throws IOException  {
        if( containerRequestContext.getUriInfo().getPath().contains("/public/") )
            return; // user is in public area - doesn't matter if they are authenticated

        // guess at how to check if user is authenticated
        if( httpServletRequest.getSession().get("user_is_ok") )
            return;

        httpServletResponse.sendRedirect("/login");
        // or maybe
        httpServletResponse.sendError(SC_UNAUTHORIZED);   
    }
}

Опять же, это всего лишь предположение, но это довольно распространенный способ решения вашей задачи.

person stdunbar    schedule 19.07.2017
comment
большое спасибо за идею. дело в том, что для нашего приложения важно иметь контекст перед ApplicationPath. Таким образом, мы можем указать путь к приложению, например /api. Но между контекстом роя (который является приложением) и ApplicationPath (API) нам нужен подконтекст, который сообщает прокси-серверу, аутентифицирован ли пользователь или нет, добавляя общедоступный или защищенный в зависимости от области, в которой находится пользователь. Есть ли у вас какие-либо идеи о том, как мы могли бы достичь этого? - person mooonli; 19.07.2017