我试图通过JSP和控制器上传文件,但我总是得到
HTTP状态405 - 请求方法' POST'不支持
输入状态报告
消息请求方法' POST'不支持
description请求的资源不允许使用指定的HTTP方法。
这是我的表单(只是所有JSP页面的一部分):
<form method="POST" enctype="multipart/form-data" action="product.file.add">
<input name="productId" type="hidden" />
<tr>
<th>Foto: </th>
<td><input type="file" name="file" /></td>
</tr>
<tr>
<td class="bt" ><input type="submit" value="Add image" /></td>
<td class="bt" ><input type="submit" value="Continue without image" /></td>
</tr>
</form>
我的控制器的一部分(现在只有一个软件文件名):
@RequestMapping(value = "/admin/product.file.add", method = RequestMethod.POST)
public String productFileUpload(@RequestParam("file") MultipartFile file,
@RequestParam("productId") int productId) {
logger.info(file.getName());
return "redirect:/admin/product";
}
servlet-context.xml的一部分
<beans:bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
但我总是得到:
HTTP状态405 - 请求方法&#39; POST&#39;不支持
你能帮我一个人吗? :(我的控制器没有所有方法:
@Controller
public class ProductController {
@Autowired
private ProductDao productDao;
@Autowired
private ProducerDao producerDao;
@Autowired
private SectionDao sectionDao;
@Autowired
private TasteDao tasteDao;
@Autowired
private CategoryDao categoryDao;
private static final Logger logger = LoggerFactory
.getLogger(ProductController.class);
@RequestMapping(value = "/admin/productfileadd", method = RequestMethod.POST)
public String productFileUpload(@RequestParam("file") MultipartFile file,
@RequestParam("productId") int productId) {
logger.info(file.getName());
return "redirect:/admin/product";
}
}
我的应用程序运行于:
http://localhost:8080/prosvaly/
我在所有人中使用相同的&#34;动作风格&#34;它的工作原理。当我按下按钮时,以这种形式。它以正确的方式重定向我。我试图改变我的行动
action="/prosvaly/admin/productfileadd
但仍然是同样的错误。当我将方法类型从POST更改为GET时,我收到另一个错误:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.web.multipart.MultipartException: The current request is not a multipart request
所以我认为这个问题不起作用,因为GET方法可以找到相同的URL
答案 0 :(得分:12)
主要问题在于春季安全问题。我解决了这个问题。 Sprinf安全阻止了我的网址,但我不知道为什么。
我解决了这个问题,我添加了?$ {_ csrf.parameterName} = $ {_ csrf.token} 来结束表单操作
<form method="POST" action="uploadOneFile**?${_csrf.parameterName}=${_csrf.token}**" enctype="multipart/form-data">
现在有效!
答案 1 :(得分:0)
@RequestMapping的值是“/admin/product.file.add”,表单的动作是action =“product.file.add”。我认为应该是action =“/ admin / product.file.add”
或者您可以尝试使用<form method="POST" enctype="multipart/form-data" action="/product.file.add">
答案 2 :(得分:0)
我有同样的问题,我的解决方案也不同。在我的情况下,我使用基于注释的配置我使用@Controller
注释我的类,但我从未告诉配置类扫描控制器所在的包,并且执行此操作的方法是使用
@ComponentScan(basePackages = "com.controllers.location.package")
答案 3 :(得分:0)
Spring MVC 默认配置为通过要求服务器生成的 CSRF 令牌作为 POST 请求的一部分返回来防止 Cross-Site Request Forgery (CSRF) 攻击。
在表单模板中包含 CSRF 令牌就像输入一样简单:
<input type="hidden"
th:name="${_csrf.parameterName}"
th:value="${_csrf.token}">
您可以在每个路由的基础上禁用 CSRF 保护,例如:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
}
这两个例子都来自 Spring documentation about CSRF。
在决定这样做之前应该权衡禁用 CSRF 请求验证的危险 - 它会让您的用户在某些情况下接受操作劫持。
这里有几篇关于这个主题的更有帮助的文章: https://www.baeldung.com/spring-security-csrf https://www.baeldung.com/csrf-thymeleaf-with-spring-security