1

我正在开发一个基于 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 应用程序并访问上面的 restendpoint 之一,一切正常(例如http://localhost:8080/app/public/api/offer/reduced

但是,如果我想访问我的一个 html(例如 login.html)文件,它位于 /webapp 正下方,我会得到 404,尽管该文件已正确捆绑(例如,在尝试访问http://localhost:8080/时)应用程序/login.html)。所以在我看来,RESTeasy 隐藏了这个 html 文件,因为它在 root (/) 上侦听。

由于我的 url 的第一部分是上下文(由代理注入),因此我无法在我的 XYZApplication 中将根 (/) 以外的任何内容设置为 ApplicationPath。

您对我如何解决此问题有任何想法吗?

非常感谢您的帮助。

4

1 回答 1

0

您需要将 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);   
    }
}

同样,这有点猜测,但这是处理挑战的一种非常常见的方式。

于 2017-07-19T17:20:57.810 回答