У меня есть веб-служба 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.
Я использовал последовательность в In Flow на WSO2 AM, но результаты все те же.
<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 у вас может быть функция, которая будет возвращать 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.
}
}