Опитвам се да направя ajax повикване към моя Spring контролер/действие с POST метод и да върна обект от сървъра с @ResponseBody. Странната ситуация е, че спира да работи след добавяне на пружинен защитен слой, преди всичко работеше добре. Ще се опитам да обясня ходовете си за решаване на проблема и след това да ви покажа кода/улавянията/и т.н.
1. След известно проучване намерих някои отговори, които казват, че проблемът може да е свързан с механизма на csrf, така че го деактивирах и все още имам проблема. (spring-security.xml по-долу)
2. Направих wireshark capture, за да проверя заявката/отговора. Моята ajax заявка е наред, декларацията на контролера ми е наред, но не разбирам защо, отговорът 405 показва > Разрешаване: GET (снимка по-долу)
3. Опитах се да осъществя достъп до моето действие на контролера през браузъра (т.е. да направя GET заявка) и получавам грешка HTTP Статус 405 - Методът на заявка „GET“ не се поддържа!
4. Опитах се да променя RequestMapping(method...) на RequestMethod.GET и заявката пристига до контролера и работи добре, но не искам да работи с GET метода, искам POST заявка.
5. Променено е RequestMapping(consumes, produces, headers), за да приема всички видове данни, но все още 405...
Това ме подлудява! Публикувам файловете си по-долу, за да можете да ги проверите, момчета, всеки съвет ще бъде оценен. Благодаря! (ВАЖНА ЗАБЕЛЕЖКА: това е моята конфигурация на отчаяние)
spring-security.xml
<beans:beans
xmlns...(all needed declarations)>
<http pattern="/js/**" security="none" />
<http pattern="/css/**" security="none" />
<!-- enable use-expressions -->
<http auto-config="true" >
<access-denied-handler error-page="/403" />
<intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')" />
<intercept-url pattern="/login" access="isAnonymous()" />
<intercept-url pattern="/403" access="permitAll" />
<intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
<form-login login-page="/login"
username-parameter="email"
password-parameter="password"
authentication-failure-url="/login?failed" />
<!--
<csrf/>
-->
</http>
..... (authentication)
AdminController.java
@Controller
@RequestMapping("/admin**")
public class AdminController {
... (all my autowired beans)
@RequestMapping(
value = "/events/loadEvents",
method = RequestMethod.POST,
consumes = MediaType.ALL_VALUE,
produces = MediaType.ALL_VALUE,
headers = "Accept=*/*")
@ResponseBody
public Event loadEvents(@RequestParam("parentId") long parentId) {
... (my logic)
return event;
}
}
Отговор (улавяне на wireshark)
РЕДАКТИРАНЕ jquery ajax код за извикване
$.ajax({
type: 'POST',
cache: false,
url: /admin/events/loadEvents,
data: { parentId: 1 },
dataType = 'json',
contentType = 'application/json',
...
});