首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查在restlet框架中调用资源的客户端的地址(域、端口、模式)?

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

Stack Overflow用户
提问于 2018-07-12 17:23:27
回答 1查看 378关注 0票数 0

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

到目前为止,我还没有找到这个信息。

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

代码语言:javascript
复制
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上运行的客户端的请求时,在资源日志中我得到以下行:

代码语言:javascript
复制
addr: 127.0.0.1 
fwd: []
upstream: 127.0.0.1 
port: 57275

我还尝试设置:

代码语言:javascript
复制
server.getContext().getParameters().add("useForwardedForHeader", "true");

。。没有变化

我还尝试列出了请求头,里面没有合适的信息。

请问,您有什么建议,如何获取呼叫方的IP (模式,域名,端口)?

非常感谢

EN

回答 1

Stack Overflow用户

发布于 2018-07-12 18:19:50

在Java 6中使用Restlet 2.0时,这种方法适用于我:

代码语言:javascript
复制
/**
 * 
 * @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中还有一些在这种情况下可能有用的函数。它们是:

如果client.

  • Reference getOriginalRef()返回目标资源的引用,则
  1. Reference getOriginalRef()返回getResourceRef()请求的原始引用。

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

代码语言:javascript
复制
/**
 * 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);
}

使用上述函数读取头的代码。

代码语言:javascript
复制
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应用程序的端口号。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51301852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档