2017-07-19 122 views
1

我正在開發一個基於Wildfly Swarm的項目。我現在遇到的問題是RESTeasy隱藏了我的index.html(和其他html文件),這些文件位於/ webapp下面,因爲RESTeasy在根級別上偵聽。Wildfly Swarm RESTeasy隱藏了webapp/index.html

我的主要用途:

@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羣的應用程序及以上restendpoint的訪問之一,一切工作正常(如http://localhost:8080/app/public/api/offer/reduced

但如果我喜歡德對我的html的訪問之一(例如login.html的),這是正下方的文件/ webapp,我得到了一個404,儘管這個文件是正確綁定的(例如試圖訪問http://localhost:8080/app/login.html)。所以在我看來,RESTeasy會隱藏這個html文件,導致它在根(/)上進行偵聽。

由於我的網址的第一部分是上下文(由代理注入),因此我無法在XYZApplication中將ApplicationPath設置爲除ApplicationPath之外的其他任何內容。

你對我如何解決這個問題有什麼想法嗎?

非常感謝您的幫助。

+0

如果您無法設置不同的ApplicationPath,那確實很難。 你可以提出一個簡單的項目的問題,我們可以看看,https://issues.jboss.org/browse/SWARM – Ken

回答

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); 
    } 
} 

再次,這是一個猜測,但這是一個處理您的挑戰相當常見的方式。

+0

非常感謝這個想法。關鍵是我們的應用程序在ApplicationPath之前有上下文。所以我們可以設置一個像/ api這樣的應用程序路徑。但是在swarm上下文(它是「app」)和ApplicationPath(「api」)之間,我們需要一個子上下文來告訴代理用戶是否通過認證,通過添加「public」或「protected」用戶是。你對我們如何實現這一目標有任何想法嗎? – mooonli