使用Spring安全性保存多部分表单数据时出现错误HTTP状态405-请求方法';邮政';不支持 通过返回HTTP状态405的spring表单上载文件-不支持请求方法“POST”,已启用spring安全性 基于Java的配置 模型 控制器 形式 请求头
POST/urce/Alumbers HTTP/1.1 主机:本地主机:8080 连接:保持活力 内容长度:96286 缓存控制:最大年龄=0 来源: 升级不安全的请求:1 内容类型:多部分/表单数据;boundary=--WebKitFormBoundaryrAL3hxUGtppolJFd 用户代理:Mozilla/5.0(Windows NT 6.1;Win64;x64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/68.0.3440.106 Safari/537.36 接受:text/html、application/xhtml+xml、application/xml;q=0.9,图像/webp,图像/apng,/;q=0.8 推荐人: 接受编码:gzip,deflate,br 接受语言:en-US,en;q=0.9 Cookie:JSESSIONID=1ED3DB210F38EC734E99CE420E16042B_ga=GA1.1.1771599779.1532604925_gid=GA1.1.1755993342.1534396304_gat=1 DNT:1使用Spring安全性保存多部分表单数据时出现错误HTTP状态405-请求方法';邮政';不支持 通过返回HTTP状态405的spring表单上载文件-不支持请求方法“POST”,已启用spring安全性 基于Java的配置 模型 控制器 形式 请求头,java,spring,spring-mvc,spring-security,Java,Spring,Spring Mvc,Spring Security,POST/urce/Alumbers HTTP/1.1 主机:本地主机:8080 连接:保持活力 内容长度:96286 缓存控制:最大年龄=0 来源: 升级不安全的请求:1 内容类型:多部分/表单数据;boundary=--WebKitFormBoundaryrAL3hxUGtppolJFd 用户代理:Mozilla/5.0(Windows NT 6.1;Win64;x64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/68.0.3440.106 Safari/
响应头 不允许使用HTTP/1.1 405方法 服务器:ApacheCoote/1.1 X-Content-Type-Options:nosniff X-XSS-Protection:1;模式=块 缓存控制:无缓存,无存储,最大年龄=0,必须重新验证 Pragma:没有缓存 过期日期:0 X帧选项:拒绝 允许:获取 内容类型:text/html;字符集=ISO-8859-1 内容语言:英语 内容长度:1047 日期:2018年8月17日星期五08:49:28 GMT
解决方案 通过在应用程序配置中的public commons multipartresolver getMultipartResolver()方法之上指定@Bean(name=“filtermultippartresolver”)注释,扩展WebMVCConfigureAdapter解决了我的问题 确保bean名为filterMultipartResolver(name=“filterMultipartResolver”),因为MultipartFilter不会拾取任何其他bean名 我的初始配置不起作用,因为这个bean被命名为name=“multipartResolver”,我还通过删除@bean注释中的名称进行了测试 我遵循了本文提供的解决方案
请尝试此操作我不想在我的操作中包含csrf令牌,我想将MultipartFilter放在Spring Security之前,然后在控制器中尝试添加@Secured(AuthoritiesConstants.USER)Added@Secured(AuthoritiesConstants.USER)到控制器中在应用程序配置中获得相同错误bean名称应命名为[@bean(name=“filterMultipartResolver”)]()
public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {
@Override
protected void beforeSpringSecurityFilterChain(ServletContext servletContext) {
insertFilters(servletContext, new MultipartFilter());
}
}
@Entity
@Table(name="alumni")
public class Alumni implements Serializable{
private static final long serialVersionUID = 1L;
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@NotEmpty
@Column(name="studentName", nullable=false)
private String studentName;
@NotEmpty
@Column(name="program", nullable=false)
private String program;
@Transient
private MultipartFile file;
@Column(name="content")
@Lob
private Blob content;
@Column(name="contentType", nullable=false)
private String contentType;
@Column(name="fileName", nullable=false)
private String fileName;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public String getProgram() {
return program;
}
public void setProgram(String program) {
this.program = program;
}
public Blob getContent() {
return content;
}
public void setContent(Blob content) {
this.content = content;
}
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public MultipartFile getFile() {
return file;
}
public void setFile(MultipartFile file) {
this.file = file;
}
}
@RequestMapping(value={"/alumni"}, method=RequestMethod.POST)
public String saveAlumni(@Valid Alumni alumni, BindingResult result, ModelMap model) {
System.out.println("Alumni : "+alumni);
if (result.hasErrors()) {
model.addAttribute("errors", result.getAllErrors());
return "alumni_u";
} else {
Verification verification = verificationService.getByTypeAndVerificationOn(VerificationType.EMAIL.getVerificationType(), alumni.getEmail());
if(verification!=null && verification.getCode().equals(alumni.getEmailVerificationCode())){
if(alumni.getFile()!=null){
try{
if(Arrays.asList(imageArray).contains(alumni.getFile().getContentType())){
alumni.setContent(new SerialBlob(alumni.getFile().getBytes()));
alumni.setContentType(alumni.getFile().getContentType());
alumni.setFileName(alumni.getFile().getOriginalFilename());
alumniService.save(alumni);
}else{
model.addAttribute("errors", messageSource.getMessage("NotAllowed.alumni.image.format", null, null));
return "alumni_u";
}
}catch(Exception e){
logger.error(messageSource.getMessage("Error.alumni.file.blob", null, null));
e.printStackTrace();
model.addAttribute("errors", messageSource.getMessage("Error.alumni.file.blob", null, null));
return "alumni_u";
}
}else{
alumniService.save(alumni);
}
}else{
model.addAttribute("errors", messageSource.getMessage("Invalid.alumni.verificationCode.email", new Object[] {alumni.getEmail()}, null));
return "alumni_u";
}
model.addAttribute("success", messageSource.getMessage("success.alumni.form.submition", null, null));
return "alumniSuccess_u";
}
}
<form:form method="POST" modelAttribute="alumni" enctype="multipart/form-data" >
<form:errors path="*" class="has-error" />
<form:input type="hidden" path="id" id="id" />
<ul>
<li class="alumni-leftinput clear">
<label>Name* :</label>
<form:input type="text" path="studentName" id="studentName" onkeypress="return keyRestrict(event, 'char');"/>
<div class="has-error">
<form:errors path="studentName" class="help-inline"/>
</div>
</li>
<li class="alumni-leftinput clear">
<label>Department/Program* :</label>
<form:select path="program" class="form-control input-sm" onchange="getAlumniCourse();">
<form:option value="" label="--- Select ---" />
<form:option value="Under Graduate" label="Under Graduate - UG"/>
<form:option value="Post Graduate" label="Post Graduate - PG"/>
</form:select>
<div class="has-error">
<form:errors path="program" class="help-inline"/>
</div>
</li>
<li class="full-width clear">
<label>Recent color photograph (Image dimensions 2" x 2") :</label>
<form:input type="file" path="file" id="file" />
<span>Upload Bitmap / jpeg / gif / png formats only. Size below 2MB</span>
</li>
<li class="clear">
<button type="submit" class="dt-sc-button noborder" value="Submit">Submit</button>
</li>
</ul>
<input type="hidden" name="_csrf" value="7ba6b5a7-7fed-4bb6-b54e-a781576e85e3">
@Bean
public CommonsMultipartResolver multipartResolver() throws IOException{
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
resolver.setDefaultEncoding("utf-8");
resolver.setMaxUploadSizePerFile(5242880);//5MB
return resolver;
}
@Bean(name="filterMultipartResolver")
public CommonsMultipartResolver getMultipartResolver() throws IOException{
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
resolver.setDefaultEncoding("utf-8");
resolver.setMaxUploadSizePerFile(5242880);//5MB
return resolver;
}