WSO2AM - 将请求 IP 传递给后端
WSO2AM - Pass request IP to backend
我有一个 RESTful 网络服务。它的端点需要请求 IP。我使用波纹管函数来获取请求 IP。
String callerIpAddress = "";
String xForwardedForHeader = request.getHeader("X-FORWARDED-FOR");
if (xForwardedForHeader == null) {
callerIpAddress = request.getRemoteAddr();
}
如果我直接 运行 这些端点,变量 callerIpAddress 会准确显示请求 IP。
但是当我通过 WSO2 AM 发布它时。 callerIpAddress 仅显示值:127.0.0.1.
我在 WSO2 AM 上使用了 In Flow 中的一个序列,但结果还是一样
<sequence xmlns="http://ws.apache.org/ns/synapse" name="get-real-ip-json-input">
<property name="X-Forwarded-For" expression="get-property('axis2','REMOTE_ADDR')"/>
<log level="custom">
<property name="Actual Remote Address " expression="get-property('X-Forwarded-For')"/>
</log>
</sequence>
谁能帮我解决这个问题?谢谢
创建文件global_ext.xml
到
<APIM_HOM>/repository/deployment/server/synapse-configs/default/sequences
(API_HOME是你WSO2AM的主目录,比如/opt/WSO2AM-vername
)里面会有以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<sequence xmlns="http://ws.apache.org/ns/synapse" name="WSO2AM--Ext--In">
<filter source="get-property('transport','X-Forwarded-For')" regex=".*">
<then>
<property name="coming-X-Forwarded-For"
expression="fn:concat(get-property('transport','X-Forwarded-For'), ', ')"
scope="axis2"
type="STRING"/>
<property name="clientIP" expression="get-property('axis2','REMOTE_ADDR')"/>
<property name="X-Forwarded-For"
expression="fn:concat(get-property('axis2','coming-X-Forwarded-For'), get-property('clientIP'))"
scope="transport"
type="STRING"/>
</then>
<else>
<property name="X-Forwarded-For"
expression="get-property('axis2','REMOTE_ADDR')"
scope="transport"
type="STRING"/>
</else>
</filter>
<log level="custom">
<property name="client_ip_address"
expression="get-property('transport','X-Forwarded-For')"/>
</log>
</sequence>
有时添加新序列后需要重新启动 wso2-am。
在您的 REST 网络服务中,您可以有一个函数将 return IP 地址,例如:
private String getSourceIp() {
if (request!= null && request.getHeader("X-Forwarded-For") != null) {
return request.getHeader("X-Forwarded-For");
} else {
return "0.0.0.0"; //or you can throw an error depending on how you want to handle it.
}
}
我有一个 RESTful 网络服务。它的端点需要请求 IP。我使用波纹管函数来获取请求 IP。
String callerIpAddress = "";
String xForwardedForHeader = request.getHeader("X-FORWARDED-FOR");
if (xForwardedForHeader == null) {
callerIpAddress = request.getRemoteAddr();
}
如果我直接 运行 这些端点,变量 callerIpAddress 会准确显示请求 IP。
但是当我通过 WSO2 AM 发布它时。 callerIpAddress 仅显示值:127.0.0.1.
我在 WSO2 AM 上使用了 In Flow 中的一个序列,但结果还是一样
<sequence xmlns="http://ws.apache.org/ns/synapse" name="get-real-ip-json-input">
<property name="X-Forwarded-For" expression="get-property('axis2','REMOTE_ADDR')"/>
<log level="custom">
<property name="Actual Remote Address " expression="get-property('X-Forwarded-For')"/>
</log>
</sequence>
谁能帮我解决这个问题?谢谢
创建文件global_ext.xml
到
<APIM_HOM>/repository/deployment/server/synapse-configs/default/sequences
(API_HOME是你WSO2AM的主目录,比如/opt/WSO2AM-vername
)里面会有以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<sequence xmlns="http://ws.apache.org/ns/synapse" name="WSO2AM--Ext--In">
<filter source="get-property('transport','X-Forwarded-For')" regex=".*">
<then>
<property name="coming-X-Forwarded-For"
expression="fn:concat(get-property('transport','X-Forwarded-For'), ', ')"
scope="axis2"
type="STRING"/>
<property name="clientIP" expression="get-property('axis2','REMOTE_ADDR')"/>
<property name="X-Forwarded-For"
expression="fn:concat(get-property('axis2','coming-X-Forwarded-For'), get-property('clientIP'))"
scope="transport"
type="STRING"/>
</then>
<else>
<property name="X-Forwarded-For"
expression="get-property('axis2','REMOTE_ADDR')"
scope="transport"
type="STRING"/>
</else>
</filter>
<log level="custom">
<property name="client_ip_address"
expression="get-property('transport','X-Forwarded-For')"/>
</log>
</sequence>
有时添加新序列后需要重新启动 wso2-am。
在您的 REST 网络服务中,您可以有一个函数将 return IP 地址,例如:
private String getSourceIp() {
if (request!= null && request.getHeader("X-Forwarded-For") != null) {
return request.getHeader("X-Forwarded-For");
} else {
return "0.0.0.0"; //or you can throw an error depending on how you want to handle it.
}
}