@P_Alexander
First head

Почему не находит CSRF Token при отправке multipart/form-data в Spring?

Добрый вечер, при попытке загрузить файл выпадет ошибка MyAccessDeniedHandler --> Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'
Вопрос почему?
Как исправить?
Важно, при оправке обычных запросов, все нормально работает....
Мои настройки спринга и что я сделал..
У меня спринг и тхумелеаф, тхумелеаф вставляет токен в форму автоматом, а в спринге он включем по дефолту.
Сделал бил -StandardServletMultipartResolver
@Bean
public StandardServletMultipartResolver multipartResolver() {
    return new StandardServletMultipartResolver();
}

2. Установил MultipartConfigElement
public class AppConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[]{ WebConfig.class, WebSecurityConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[]{WebConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

   private String TMP_FOLDER = "../resources/images";
   private int MAX_UPLOAD_SIZE = 5 * 1024 * 1024;

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        super.onStartup(servletContext);
        servletContext.addListener(new SessionListener());

        ServletRegistration.Dynamic appServlet = servletContext.addServlet("mvc", new DispatcherServlet(new GenericWebApplicationContext()));



      MultipartConfigElement mce = new MultipartConfigElement(TMP_FOLDER, MAX_UPLOAD_SIZE, MAX_UPLOAD_SIZE * 2, MAX_UPLOAD_SIZE / 2);
      appServlet.setMultipartConfig(mce);
    }


    @Override
    protected FrameworkServlet createDispatcherServlet(WebApplicationContext servletAppContext) {
        final DispatcherServlet dispatcherServlet = (DispatcherServlet) super.createDispatcherServlet(servletAppContext);
        dispatcherServlet.setThrowExceptionIfNoHandlerFound(true);
        return dispatcherServlet;
    }
}

3. контроллер
@Controller
public class UploadController {
    private static final Logger logger = LogManager.getLogger(UploadController.class);

    @RequestMapping(value = "/uploadImage", method = RequestMethod.GET)
    public String showUploadImage(Model model) {
        return "uploadImage";
    }

    @RequestMapping(value = "/uploadImage", method = RequestMethod.POST)
    public String uploadImage(@RequestParam("file") MultipartFile file,  Model model) {
        logger.debug("UPLOAD FILE getContentType" + file.getContentType());
        logger.debug("UPLOAD FILE getName " + file.getName());
        return "uploadImage";
    }
}


4. моя форма
<form th:action="@{/uploadImage}" enctype="multipart/form-data" method="POST" >
            <input type="file" name="file" />
            <input type="submit" value="Upload" />
        </form>


Как это победить? Спасибо.
  • Вопрос задан
  • 396 просмотров
Пригласить эксперта
Ответы на вопрос 1
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Виден ли токен в исходном коде DOM внутри тега form?
А при сабмите формы CSRF токен отправляется?

Конфиги для multipartfile я прописываю в properties С проблемой почему null в CSRF при отправке формы не сталкиввлся.
# File upload size
spring.servlet.multipart.max-file-size=20MB
spring.servlet.multipart.max-request-size=20MB
spring.servlet.multipart.file-size-threshold=2KB
# Uploads
spring.servlet.multipart.enabled=true
fl.upload_path=/home/phoenix/example.com/uploads
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы