如何在restlet框架中检查调用资源的客户端的地址(域,端口,架构)?

时间:2018-07-12 09:23:27

标签: restlet

在Restlet框架中,我试图检查对资源的请求是否来自特定的IP地址。

到目前为止,我找不到此信息。

在资源代码中,我查看了整个getRequest()和getRequest()。getClientInfo()内容,但未成功。 在资源代码中:

ClientInfo info = getRequest().getClientInfo();
// this code returns the address (if set) but no port, no schema
// i was also not able to undesrtand, which address means exactly what
logger.info("addr: "+info.getAddress());
logger.info("fwd: "+getClientInfo().getForwardedAddresses());
logger.info("upstream: "+getClientInfo().getUpstreamAddress());

// this returns some strange number, definitely not the port of the caller
logger.info("port: "+info.getPort());

当我从运行在http://localhost:9996/test的客户端执行请求时,在资源日志中,我得到以下几行:

addr: 127.0.0.1 
fwd: []
upstream: 127.0.0.1 
port: 57275

我也尝试设置:

server.getContext().getParameters().add("useForwardedForHeader", "true");

..没有变化

我也试图列出请求标头,里面没有合适的信息。

请问,关于如何获取呼叫者IP(架构,域,端口),您有什么建议吗?

非常感谢您

1 个答案:

答案 0 :(得分:0)

此方法在Java 6中使用Restlet 2.0时对我有效:

/**
 * 
 * @param request
 * @return
 */
public static String getBasePath(org.restlet.Request request){
    org.restlet.data.Reference rootRef = request.getRootRef();
    org.restlet.data.Reference hostRef = request.getHostRef();
    int hostPort = hostRef.getHostPort();
    return (    rootRef.getScheme()
                + "://"
                + hostRef.getHostDomain()
                + ( ( hostPort==-1 ) ? "" : (":" + hostPort) )
                + rootRef.getPath()
                + "/"
            )
    ;
}

如果看到代码,它将使用org.restlet.Request.getRootRef()org.restlet.Request.getHoatRef()org.restlet.data.Reference..getHostDomain()org.restlet.data.Reference.getScheme()org.restlet.data.Reference.getPath()org.restlet.data.Reference..getHostPort()

如果这不起作用,请更新您的问题。

编辑:(第一条评论之后) org.restlet.Request中还有其他一些功能在这种情况下可能会有用。他们是:

  1. 引用getOriginalRef()返回客户端请求的原始引用。
  2. 引用getReferrerRef()返回引用引用(如果可用)。
  3. 引用getResourceRef()返回目标资源的引用。

编辑2:读取请求标头的代码。

/**
 * This method return the HTTP headers as an object of Restlet Form
 * @param serverResource
 * @return
 */
public static org.restlet.data.Form getRequestHeaders(org.restlet.resource.ServerResource serverResource)
{   return (org.restlet.data.Form) serverResource.getRequestAttributes().get(org.restlet.engine.http.header.HeaderConstants.ATTRIBUTE_HEADERS);
}

使用上述功能读取标头的代码。

public class MyResource extends ServerResource
{
.
.
@Get/Post/...
public Object/void myFunc(Arguments...)
{
    Form headers = RestletUtil.getRequestHeaders(this);
    boolean ignoreCase = true ;
    // Note: 'Host' header is in HTTP/1.1
    String stringHostHeader = headers.getFirstValue("Host", ignoreCase);
    System.out.println("value of 'Host' header is: " + stringHostHeader);
    .
    .

告诉我们您得到了什么结果。

编辑3: 到目前为止,该答案假设服务器应用程序想要读取“客户端如何看待服务器”。但是,注释部分显示,在这种情况下,服务器应用程序希望知道客户端的字母数字名称以及在客户端计算机上运行的Web应用程序的端口号。