我已经建立了一个App Engine Restlet项目(v 2.2.2),它为不同的用户返回一个html或json响应(web或android客户端)和db的不同数据。我已经实现了HTTP基本身份验证。一切都运作良好。
我的基本设置atm(我简化了它):
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方法放在哪里(以下代码来自教程)?我应该在哪个类中插入它,或者我应该创建一个单独的服务器类,以及对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 :(得分:1)
你的问题有点令人困惑,可能是因为你走的路。
您的原始计划创建了一个RESTlet Web应用程序,其中包含web.xml以在容器内运行,例如GAE,Jetty或Tomcat。
您提出的建议创建一个组件并启动独立服务器(它启动Jetty的内部实例)。这不会在Google App Engine上运行。
您应继续使用web.xml方法并将GAE配置为通过https提供服务。有关配置说明,请参阅https://cloud.google.com/appengine/kb/general#https和https://cloud.google.com/appengine/docs/java/config/webxml#Secure_URLs。
另外,另一个提示:当某些东西试图未经授权访问资源时返回403状态。
答案 1 :(得分:0)
所以我试图将JavaSE RESTLET应用程序转换为JavaEE应用程序。我从&#34; Restlet in Action&#34;本书,第72页,我们不需要将服务器连接到组件,因为Servlet引擎处理传入的HTTP和HTTPS请求。
本教程还指出组件文件是web.xml中的INIT-PARAM或param-name。但对我来说,上述两项变更都没有奏效。
如果我将应用程序类指向为INIT-PARAM并且不使用书中建议的HTTP连接器,我可以访问API但无法从客户端类进行任何调用,因为我得到了以下内容错误 -
警告:此请求使用的协议未在客户端连接器列表中声明。 (HTTP / 1.1)。如果您正在使用Component类的实例,请检查其&#34;客户端&#34;属性。 未找到(404) - 服务器未找到与请求URI匹配的任何内容
希望这些信息以某种方式帮助您
修改强>
我找到了解决上述问题的方法 - 我不得不添加以下代码
<init-param>
<param-name>org.restlet.clients</param-name>
<param-value>HTTP HTTPS FILE</param-value>
</init-param>
同样针对您的问题,您需要通过XML配置组件。 URL下方将提供更多信息 -
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