2016-06-10 4 views
2

Итак, я пытаюсь отправить некоторые данные в веб-службу, используя входящий шлюз Spring интеграции. Метод GET работает нормально. Поэтому я попытался использовать POST, я передаю некоторую строку. И пытаюсь получить простую строку. Вы можете проверить TestService. Но каждый раз, когда я пытаюсь запустить тестовый пример, я получаю ошибку 403. Я проверил Spring Security и все остальные аспекты, но не смог обернуть это вокруг. Я googled около 2 дней, но ни одного понятия об этом.Получение 403 с методом POST входящего шлюза - интеграция с весной

Вы можете посмотреть ссылку THIS, чтобы увидеть, что мои другие функции, которые являются методами GET и работают нормально. У меня есть эта проблема только с POST! Поэтому, пожалуйста, помогите мне узнать, что не так с моим кодом!

Мой integration.xml является:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd 
    http://www.springframework.org/schema/integration/http http://www.springframework.org/schema/integration/http/spring-integration-http.xsd 
    http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm.xsd" 
xmlns:int="http://www.springframework.org/schema/integration" 
xmlns:oxm="http://www.springframework.org/schema/oxm" 
xmlns:int-http="http://www.springframework.org/schema/integration/http"> 

<int:annotation-config/> 

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
    <property name="order" value="1" /> 
    <property name="contentNegotiationManager"> 
     <bean class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> 
      <property name="defaultContentType" value="application/json"/> 
      <property name="favorParameter" value="true"/> 
      <property name="ignoreAcceptHeader" value="true" /> 
      <property name="mediaTypes"> 
       <map> 
        <entry key="json" value="application/json" /> 
        <entry key="xml" value="application/xml" /> 
       </map> 
      </property> 
     </bean> 
    </property> 
    <property name="defaultViews"> 
     <list> 
      <bean 
       class="org.springframework.integration.samples.rest.json.view.ExtendedMappingJacksonJsonView" > 
       <property name="objectMapper" ref="jaxbJacksonObjectMapper"/> 
      </bean> 
      <bean class="org.springframework.web.servlet.view.xml.MarshallingView"> 
       <constructor-arg ref="marshaller"/> 
      </bean> 
     </list> 
    </property> 
</bean> 

<int:channel id="orderRequestChannel" /> 
<int:channel id="orderResponseChannel" /> 

<int-http:inbound-gateway id="inboundOrderRequestGateway" 
    supported-methods="POST" 
    request-channel="orderRequestChannel" 
    reply-channel="orderResponseChannel" 
    view-name="/order" 
    path="/order/view" 
    request-payload-type="java.lang.String" 
    reply-timeout="50000"> 
</int-http:inbound-gateway> 

<int:service-activator id="orderGatewayActivator" 
       input-channel="orderRequestChannel" 
       output-channel="orderResponseChannel" 
       ref="testService" 
       method="createOrder" 
       requires-reply="true" 
       send-timeout="60000" /> 
<oxm:jaxb2-marshaller id="marshaller" context-path="org.springframework.integration.samples.rest.domain" /> 
<bean id="jaxbJacksonObjectMapper" class="org.springframework.integration.samples.rest.json.JaxbJacksonObjectMapper"/> 

Метод испытания Сервис:

@Service("testService") 
public class TestService { 

    public Message<String> createOrder(Message<String> orderRequest) { 
    System.out.println("Inside!!!!!!!!!!"); 
    return MessageBuilder.withPayload("Some Response!").build(); 
    } 
} 

Spring Security Файл:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:security="http://www.springframework.org/schema/security" 
xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/security 
     http://www.springframework.org/schema/security/spring-security.xsd"> 

<security:global-method-security 
    secured-annotations="enabled" /> 

<!-- Configure Spring Security --> 
<security:http auto-config="true" use-expressions="true" realm="REST HTTP Web Service" create-session="never"> 
    <security:http-basic /> 
    <security:intercept-url pattern='/services/employee/*' access="hasRole('ROLE_REST_HTTP_USER')" /> 
    <security:intercept-url pattern='/order/*' access="permitAll" /> 
    <security:csrf disabled="true" /> 
</security:http> 

<!-- In this example, we are using in memory authentication. The password encoder depends on 
       Jasypt's String Digester to digest the password stored in users.properties --> 
<security:authentication-manager alias="authenticationManager"> 
    <security:authentication-provider> 
     <security:password-encoder ref="passwordEncoder"/> 
     <security:user-service properties="classpath:users.properties" /> 
    </security:authentication-provider> 
</security:authentication-manager> 

<!-- 
    Use the StringDigester to create uni-directional password encryption. 
    All uni-directional encryption methods supported in jasypt is integrated into 
    Spring Security 
--> 
<bean id="jasyptStringDigester" class="org.jasypt.digest.StandardStringDigester" > 
    <property name="algorithm" value="SHA-1" /> 
    <property name="iterations" value="100000" /> 
    <property name="saltGenerator"> 
     <bean id="zeroSaltGenerator" class="org.jasypt.salt.ZeroSaltGenerator"/> 
    </property> 
    <property name="saltSizeBytes" value="10"/> 
</bean> 

<!-- 
    This Spring Security-friendly PasswordEncoder implementation will 
     wrap the StringDigester instance so that it can be used from 
     the security framework. 
    --> 
<bean id="passwordEncoder" class="org.jasypt.spring.security3.PasswordEncoder"> 
    <property name="stringDigester" ref="jasyptStringDigester"/> 
</bean> 

Наконец мой метод испытания:

@Test 
public void testPOST() throws Exception{ 
    final String fullUrl = "http://localhost:9080/rest-http/order/view"; 
    HttpHeaders headers = new HttpHeaders(); 
    HttpEntity<Object> request = new HttpEntity<Object>(headers); 
    ResponseEntity<?> httpResponse = restTemplate.exchange(fullUrl, HttpMethod.POST, request, String.class, "Request");  
    //restTemplate.getMessageConverters().add(jsonHttpMessageConverter); 
    if (!httpResponse.getStatusCode().equals(HttpStatus.OK)){ 
     logger.error("Problems with the request. Http status: " + httpResponse.getStatusCode()); 
    } 

} 

Пожалуйста, помогите мне, ребята !! Заранее спасибо.

+0

Вы должны разделить журналы DEBUG для 'org.springframework' категории на стороне сервера, когда вы попадаете' Post' и получите это '403 Forbidden'. –

ответ

0

Если вы используете защиту Spring, то по умолчанию включен CSRF protection, а во входящем запросе ожидается X-Csrf-Token.

Вы должны отключить это, добавив ниже в свой файл безопасности Spring Spring. Подробнее here о защите CSRF Spring и ниже кода рассматривается в разделе $ 16.4.2 Настройка защиты CSRF

<http> 
    <!-- ... --> 
    <csrf disabled="true"/> 
</http> 
+0

Пробовал, но все равно получал ту же ошибку! – Rajkumar

+0

Можете ли вы поделиться тем, что выглядел ваш обновленный XML-документ безопасности. – hagrawal

+1

Я был настолько тупым и усталым, что просто написал то, что вы написали в своем посте, а это значит, что я не отключил csrf. Как только я делаю это как правда, это сработало. Спасибо за помощь! – Rajkumar

Смежные вопросы