2014-10-01 48 views
1

我已經設置了一個App Engine Restlet Project(v 2.2.2),它爲不同的用戶返回一個html或json響應(web或android客戶端)和一個db的不同數據。我已經實現了HTTP基本認證。這一切都很好。新組件的Restlet web.xml配置

我的基本設置ATM(我已經簡化它OFC):

MyApplication.java

public class MyApplication extends Application { 

    private ChallengeAuthenticator authenticatior; 
    private ChallengeAuthenticator createAuthenticator() {...} 
    public boolean authenticate(Request request, Response response) {...} 

    @Override 
    public Restlet createInboundRoot() { 
     this.authenticatior = createAuthenticator();   
     Router router = new Router(getContext()); 
     router.attachDefault(MyRestlet.class); 
     authenticatior.setNext(router); 
     return authenticatior; 
    } 

MyRestlet.java

public class MyRestlet extends ServerResource { 

     @Get("json") 
     public Representation getJSON() { 
      MyApplication app = (MyApplication) getApplication(); 
       if (!app.authenticate(getRequest(), getResponse())) { 
        // Not authenticated 
        return null; 
       } 
       else { 
        return data;  
       } 

     @Get("html") 
     public String getHTML() {...} 
} 

的web.xml

<?xml ...> 
<display-name>MyName</display-name> 

<context-param> 
<param-name>org.restlet.application</param-name> 
<param-value>x.MyApplication</param-value> 
</context-param> 

<servlet> 
<servlet-name>MyRestlet</servlet-name> 
<servlet-class>org.restlet.ext.servlet.ServerServlet</servlet-class> 
</servlet> 

<servlet-mapping> 
<servlet-name>MyRestlet</servlet-name> 
<url-pattern>/*</url-pattern> 
</servlet-mapping> 
</web-app> 

現在我想添加加密並創建密鑰/證書。我的導遊是這個tutorial。我想先嚐試添加一個簡單的組件,然後使用HTTP並將此端口更改爲8183,如tutorial所示。我現在玩了很多,看起來不能讓我的組件工作。所以我的問題是:我會在哪裏把這個main-Method(以下代碼來自教程)?我應該在哪個類中插入它,或者我應該創建一個單獨的服務器類,以及對web.xml所需的更改是什麼樣的(我沒有發現太多關於此的內容,並且我懷疑這是中心問題)?任何幫助表示讚賞!

public static void main(String[] args) throws Exception { 
    // Create a new Restlet component and add a HTTP server connector to it 
    Component component = new Component(); 
    component.getServers().add(Protocol.HTTP, 8182); 

    // Then attach it to the local host 
    component.getDefaultHost().attach("/trace", Part05.class); 

    // Now, let's start the component! 
    // Note that the HTTP server connector is also automatically started. 
    component.start(); 
} 

回答

0

所以我試圖將JavaSE RESTLET應用程序轉換爲JavaEE應用程序。我從第72頁的「Restlet in Action」一書中瞭解到,我們不需要將服務器連接到組件,因爲Servlet引擎處理傳入的HTTP和HTTPS請求。

本教程還指出組件文件是您的web.xml中的INIT-PARAM或param-name。但是對於我來說,以上2個變化都不起作用。

如果我將應用程序類指向INIT-PARAM並且不使用本書中建議的HTTP連接器,我能夠訪問API但無法從客戶端類進行任何調用,因爲我得到低於錯誤 -

警告:此請求使用的協議未在客戶端連接器列表中聲明。 (HTTP/1.1)。如果您正在使用Component類的實例,請檢查其「clients」屬性。 未找到(404) - 服務器沒有找到任何匹配請求的URI

希望這些信息可以幫助您以某種方式


編輯

我找到了解決上面的問題 - 我不得不添加下面這段代碼

 <init-param> 
      <param-name>org.restlet.clients</param-name> 
      <param-value>HTTP HTTPS FILE</param-value> 
     </init-param> 

同樣對於您的問題,您需要通過XML配置組件。下面的網址會給更多信息 -

http://restlet.com/learn/javadocs/2.1/jee/ext/org/restlet/ext/servlet/ServerServlet.html http://restlet.com/learn/javadocs/2.1/jee/api/org/restlet/Component.html?is-external=true

1

你的問題有點令人困惑,可能是因爲你採取的路徑。

您的原始計劃會創建一個RESTlet Web應用程序,並使用web.xml在一個容器(如GAE,Jetty或Tomcat)內運行。

你提出的建議是創建一個組件並啓動一個獨立的服務器(它啓動一個Jetty的內部實例)。這不適用於Google App Engine。

您應該繼續使用web.xml方法並將GAE配置爲通過https進行服務。有關配置說明,請參見https://cloud.google.com/appengine/kb/general#httpshttps://cloud.google.com/appengine/docs/java/config/webxml#Secure_URLs

另外,另一個提示:當某些東西試圖訪問未經授權的資源時返回403狀態。