Офер за 1 день в команду BetterMe (Frontend Hiring, JavaScript/React/Redux)
×Закрыть

Java, Spring, xml-based configuration. Upload file: Request method ’POST’ not supported

Доброго времени суток.
Столкнулся с такой проблемой: stackoverflow.com/...method-post-not-supported
Собственно мой вопрос на stackoverflow представлен выше. Увы рекомендации данные там — мне не помогли. Ирония ситуации заключается в том, что выпиляв все помимо контроллера, его jsp-шек, конфигурации — метод POST срабатывает — тоесть, я где-то наплудил с xml-ами или что-то упустил, но вот вопрос — что?
Увы, у меня нет знакомых разработчиков, работавших со Spring — потому вопрос задаю сюда. Буду рад идеям как ее рещить.
Проект с фриланса и под NDA — линк на исходники с полной картиной дать не могу, но кусочки кода/конфигурации, при надобности — запросто.
Спасибо.

UPDATE Вопрос решен. Спасибо dou.ua/users/oleg-ivashko-2 , dou.ua/users/george-chumakov , dou.ua/users/a.golik за идеи и полезные линки. Причина была в невнимательности, CSRF токене. Я был удивлен, что токен не подтягивается. Ведь браузер F12 network params демонстрировал его наличие и вроде как передавал его. Решение выглядит:

<form method="POST" enctype="multipart/form-data" action="doUpload?${_csrf.parameterName}=${_csrf.token}">
        ...
        <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
    </form>
👍НравитсяПонравилось0
В избранноеВ избранном0
LinkedIn
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

А не пробовали на контент файла поставить аннотацию @RequestBody?

Или прописать
@RequestMapping(value = "/doUpload", method = RequestMethod.POST, accepts = "multipart/form-data")

И вообще какая это версия спринга?

p.s. Скорее всего проблема в CSRF токенах.

У меня стоит такая аннотация над классом контроллера.

@MultipartConfig(fileSizeThreshold = 1024 * 1024 * 10, // 10 MB
maxFileSize = 1024 * 1024 * 50, // 50 MB
maxRequestSize = 1024 * 1024 * 100)

А метод загрузки аннотациями промаплен так.

@RequestMapping(value = “/upload”, method = RequestMethod.POST)
public String handleFileUpload(@RequestParam("file") MultipartFile file) {
}

А где spring-security.xml о котором вы упоминаете в web.xml? У Вас в логах написан ответ — POST’ not supported. Это значит, что не удается сделать Request, поскольку Spring Sec. блокирует его. Консоль хрома красная? У Вас должны быть открыты директории с JS библиотеками в Security Filter. Что -то на подобии такого

<intercept-url pattern="/resources/**" access="permitAll"/>
<intercept-url pattern="/index.html" access="permitAll"/>

docs.spring.io/...nce/core-web-filters.html

Недавно запиливал подобный функционал.
В конфигурацию пошел бин:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver“/>

В контроллере
@RequestMapping(value = “/save”, method = RequestMethod.POST)
public void save(@RequestParam("file") MultipartFile file, HttpServletRequest request, HttpServletResponse response){...}

Все поднялось и полетело.

увы или к счастью — не поднялось с третего пинка(( Хотя по логике вещей — выше описаных строк должно быть достаточно...

>>

не поднялось с третего пинка
А можно подробнее? Например стэк ошибки

тоже думаю, что в security сложность, попробуй добавить CSRF токен в action (как пишут в доках goo.gl/RbawxX ), в итоге должно быть что-то около form method="post" action="doUpload?${_csrf.parameterName}=${_csrf.token}" enctype="multipart/form-data" или ещё поковыряй в эту сторону.
goo.gl/JR691H — говорят помогло.

Если это не рынковое, а внутреннее приложение, то проще выпилить с помощью security.enable-csrf параметра.

А если просто отключить Spring Security тогда работает?

Думаю автору стоит попробовать.
Самый быстрый способ — stackoverflow.com/a/27389784

Ну тогда судя по тексту на SF надо смотреть что там в /WEB-INF/spring-security.xml

если используете MultipartResolver

//Spring’s MVC stack requires that the MultipartResolver bean be called multipartResolver.
@Bean
public CommonsMultipartResolver multipartResolver() {
return new CommonsMultipartResolver();
}

еще мб поможет (если maven используете) clean сделать.

Если я не ошибся — в xml-е будет выглядеть:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
и если это так — не работает

spring.io/...uides/gs/uploading-files
попробуйте сделать как в примере, на первый взгляд — @RequestParam("fileUpload") вместо @RequestParam

вопрос конфигурации это не решает((

Подписаться на комментарии