POST-запрос к серверу Spring возвращает 403 запрещеноAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 POST-запрос к серверу Spring возвращает 403 запрещено

Сообщение Anonymous »

Я настроил свой Spring-сервер на ответ на запрос POST, содержащий объект Message, как:

Код: Выделить всё

@RequestMapping(value = "/signup", method = RequestMethod.POST, consumes = "application/json")
public @ResponseBody Message signUp(@RequestBody Message message) {
logger.info("Accessing protected resource");
return new Message(100, "Congratulations!", "You have signed up. msg:"+message.toString());
}
Клиент Android настроен на отправку запроса как:

Код: Выделить всё

@Override
protected Message doInBackground(Void... params) {
// TODO Auto-generated method stub
final String url = "http://10.0.2.2:8080/signup";
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setContentType(MediaType.APPLICATION_JSON);

HttpEntity requestEntity = new HttpEntity(signupmsg, requestHeaders);

// Create a new RestTemplate instance
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJacksonHttpMessageConverter());

try {
// Make the network request
Log.d(TAG, url);
ResponseEntity response = restTemplate.exchange(url, HttpMethod.POST, requestEntity, Message.class);
return response.getBody();
} catch (HttpClientErrorException e) {
Log.e(TAG, e.getLocalizedMessage(), e);
return new Message(0, e.getStatusText(), e.getLocalizedMessage());
} catch (ResourceAccessException e) {
Log.e(TAG, e.getLocalizedMessage(), e);
return new Message(0, e.getClass().getSimpleName(), e.getLocalizedMessage());
}
}
Однако сервер всегда возвращает ошибку 403 Forbidden. Я ожидаю, что он вернет другой объект Message
Объект Message определяется пользователем в отдельном классе. Однако если я отправлю запрос GET без инкапсулированного объекта, он сработает. Я новичок в Spring. Что мне здесь не хватает?

Обновление: Я диагностировал эту проблему, и она возникает, когда я включаю Spring Web Security. При отсутствии безопасности запрос POST выполняется успешно. Я попробовал отключить безопасность в конфигурации, но все равно не работает. (Однако запросы GET работают нормально.) В настоящее время в моем WebSecurityConfiguration.java есть следующее

Код: Выделить всё

@Configuration
@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// @formatter:off
auth.inMemoryAuthentication()
.withUser("roy")
.password("spring")
.roles("USER");
// @formatter:on
}

@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
.authorizeRequests()
.anyRequest().permitAll()
.and()
.httpBasic().disable();
// @formatter:on
}
Я включил веб-безопасность, добавив следующее в свой build.gradle

Код: Выделить всё

compile("org.springframework.boot:spring-boot-starter-security")
Я попытался отправить запрос POST с помощью браузера с помощью клиента REST, и он выдал ошибку:
Состояние HTTP 403 — ожидаемый токен CSRF не найден. Срок действия вашего сеанса истек?

Это временно исправлено с помощью .csrf().disable()

Как лучше всего решить эту проблему?

Подробнее здесь: https://stackoverflow.com/questions/273 ... -forbidden
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»