在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 (模式,域名,端口)?
非常感谢
发布于 2018-07-12 18:19:50
在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中还有一些在这种情况下可能有用的函数。它们是:
如果client.
getOriginalRef()返回目标资源的引用,则getOriginalRef()返回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应用程序的端口号。
https://stackoverflow.com/questions/51301852
复制相似问题