2014-10-01 45 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状态。