我最近在我的spring mvc应用程序中实现了一个文件上传功能,但遗憾的是它无法正常工作,因为它经常被Spring Security阻止。如果我在安全配置中禁用CSRF它可以工作,所以它让我相信那里出了问题。
Spring config:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/test/**").permitAll()
.antMatchers("/admin/**","/user/secure").hasRole("ADMIN")
.antMatchers("/**").permitAll()
.anyRequest().anonymous()
.and()
.exceptionHandling().accessDeniedPage("/denied")
.and()
.formLogin()
.loginPage("/login")
.failureUrl("/error-login")
.permitAll()
.and()
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.logoutSuccessUrl("/")
.and()
.rememberMe()
.userDetailsService(userAccessDetails)
.tokenRepository(persistentTokenRepository())
.tokenValiditySeconds(16000)
;
}
文件上传表单:
<html xmlns:th="http://www.thymeleaf.org" lang="en">
<head>
<meta charset="UTF-8"/>
<title></title>
</head>
<body>
<h4>Single File</h4>
<form method="POST" th:action="@{/test/uploadFile}" 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>
</body>
</html>
任何帮助都会受到赞赏。
注意:我必须重新创建问题,因为我错误地删除了
答案 0 :(得分:1)
你可以做三件事。
1)在Spring CSRF文档中提到实现Multipart过滤器(有关更多详细信息,请参见下面的链接) - http://docs.spring.io/spring-security/site/docs/3.2.0.CI-SNAPSHOT/reference/html/csrf.html#csrf-multipartfilter
以及多部分解析器bean http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-multipart
---除非在上传过程中涉及更多自定义代码,否则这应该可行。如果它有一些自定义,那么选项2更好
2)在config中实现SpringSecurityFilterchain。在安全过滤器开始执行之前添加Multipart过滤器。实现多部分解析器。
3)没有任何作用然后尝试在客户端转换Json中的文件并将其作为二进制数据发布到服务器。 (它是一种解决方法,并试图避免因为它不是一个好的设计)。 - 例如pdf2json你可以使用这个js文件
如果有任何选项有帮助,请告诉我。