HTTP 403 ошибка при загрузке-недопустимый CSRF токен 'null'
Этот файл содержит форму для загрузки файла
Форма загрузки.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<sec:csrfMetaTags/>
<title>File Upload</title>
</head>
<body>
<jsp:include page="/resources/layout/header.jsp"/> <!-- Header -->
<div class="container">
<form action="uploadfile" method="POST" enctype="multipart/form-data">
File to upload: <input type="file" name="file"><br />
Name: <input type="text" name="name"><br /> <br />
<input type="submit" value="Upload"> Press here to upload the file!
</form>
</div> <!-- Container -->
<jsp:include page="/resources/layout/footer.jsp"/> <!-- Footer -->
</body>
</html>
И мой метод контроллера
@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
public String uploadFileHandler(@RequestParam("name") String name,@RequestParam("file") MultipartFile file) {
if (!file.isEmpty()) {
try {
byte[] bytes = file.getBytes();
// Creating the directory to store file
String rootPath = System.getProperty("catalina.home");
File dir = new File(rootPath + File.separator + "tmpFiles");
if (!dir.exists())
dir.mkdirs();
// Create the file on server
File serverFile = new File(dir.getAbsolutePath()
+ File.separator + name);
BufferedOutputStream stream = new BufferedOutputStream(
new FileOutputStream(serverFile));
stream.write(bytes);
stream.close();
logger.info("Server File Location="
+ serverFile.getAbsolutePath());
return "You successfully uploaded file=" + name;
} catch (Exception e) {
return "You failed to upload " + name + " => " + e.getMessage();
}
} else {
return "You failed to upload " + name
+ " because the file was empty.";
}
}
У меня есть следующая ошибка при загрузке:
Http Status 403-недопустимый CSRF токен 'null' был найден в параметре запроса '_csrf' или заголовке 'X-CSRF-TOKEN'
Я также использовал пружинную защиту. Но я всегда делаю одну и ту же ошибку. я пробовал много, но не смог решить ее. Не могли бы вы помочь решить эту проблему?
1 ответ:
Похоже, что защита CSRF (Cross Site Request Forgery) в вашем приложении Spring включена. На самом деле он включен по умолчанию.
Согласно spring.io :
Когда следует использовать защиту CSRF? Наша рекомендация-использовать CSRF защита для любого запроса, который может быть обработан браузером с помощью обычный пользователь. Если вы только создаете сервис, который используется клиенты, не являющиеся браузерами, скорее всего, захотят отключить CSRF защита.
Итак, чтобы отключить его:
@Configuration public class RestSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable(); } }
Если вы хотите, чтобы защита CSRF была включена, то вы должны включить в свою форму
csrftoken
. Вы можете сделать это так:<form .... > ....other fields here.... <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/> </form>
Вы даже можете включить маркер CSRF в действие формы:
<form action="./upload?${_csrf.parameterName}=${_csrf.token}" method="post" enctype="multipart/form-data">