Вы должны определить перехватчик для захвата входящих сообщений до того, как они будут обработаны службой bussiness, извлеките параметры формы, передайте фильтр XSS и обновите параметры или прервите обработку в зависимости от ваших потребностей.
перехватчики
Это базовый пример использования CXF AbstractPhaseInterceptor
конфигурации
public class XSSInterceptor extends AbstractPhaseInterceptor<Message> {
public XSSInterceptor() {
super(Phase.INVOKE);
}
@Override
public void handleMessage(Message message) throws Fault {
// filter only application/x-www-form-urlencoded
String contentType = (String)message.get(Message.CONTENT_TYPE);
if (MediaType.APPLICATION_FORM_URLENCODED.equals(contentType)){/
// message parts
List list = message.getContent(List.class);
for (int i = 0; i < list.size();i++){
//get the parameter map
MultivaluedMap<String, String> params = (MultivaluedMap<String, String>)list.get(i);
for(String param: params.keySet()){
List<String> values = params.get(param);
//XSS filter here. Update the value list if needed or abort the request
List<String> updatedValues = xssFilter(values);
params.put(param, updatedValues);
}
}
}
}
@Override
public void handleFault(Message messageParam) {
}
}
CXF
<bean id="xssInterceptor" class="XSSInterceptor" />
<cxf:bus>
<cxf:inInterceptors>
<ref bean="xssInterceptor"/>
</cxf:inInterceptors>
</cxf:bus>
Эта конфигурация будет применяться для обслуживания как этот
@POST
@Path("/form")
@Consumes({MediaType.APPLICATION_FORM_URLENCODED})
public Response form(MultivaluedMap<String, String> params) throws WebApplicationException;
* RequestContextFilter
В качестве альтернативы вы можете использовать RequestContextFilter
public class CustomRequestFilter implements ContainerRequestFilter {
public void filter(ContainerRequestContext context) {
Message m = JAXRSUtils.getCurrentMessage();
//XSS filter here. In the same way the above intercerceptor
// finally use context.abortWith(Response) if you need to block the request
Spring конфиг
<bean id="customRequestFilter" class="com.CustomRequestFilter" />
<!-- Add filters to provider zone in JAX-RS server-->
<bean id="myRestServer" class="org.apache.cxf.jaxrs.JAXRSServerFactoryBean" lazy-init="false" init-method="create">
...
<property name="providers">
<list>
<ref bean="customRequestFilter" />
</list>
</property>
Спасибо за помощь XSSInterceptor работает нормально, но мы не можем обновлять параметры формы с помощью CustomRequestFilter. Я попробовал, но это провалилось. – Sandeep
hi @pedrofb, можете ли вы мне помочь, если мы изменим MediaType нашего сервиса отдыха от APPLICATION_FORM_URLENCODED до Application_json. Потому что в моем случае наш пользовательский интерфейс отправит только запрос Application_json, и в этом случае он не работает. Какие изменения мне нужно сделать для этого – Sandeep
С помощью 'application/json' вам приходится иметь дело с входящим потоком, а не с параметрами. Получите его с помощью 'message.getContent (InputStream.class) ', потреблять и обрабатывать строковые данные и устанавливать новое содержимое с помощью' message.getExchange(). setContent (проанализированоStream) ' – pedrofb