我试图实现使用的组合弹簧引导终点一些自定义的验证逻辑JSR-303 Bean Validation API和Spring's Validator.
基于Validator类图,似乎可以扩展其中一个CustomValidatorBean,SpringValidatorAdapter或者LocalValidatorFactoryBean将一些自定义验证逻辑添加到重写方法中validate(Object target, Errors errors).
但是,如果我创建一个验证器来扩展这三个类中的任何一个并使用@InitBinder其validate(Object target, Errors errors)方法注册它,则永远不会调用它,也不会执行验证.如果我删除@InitBinder然后默认弹簧验证器执行JSR-303 Bean Validation.
休息控制器:
@RestController
public class PersonEndpoint {
@InitBinder("person")
protected void initBinder(WebDataBinder binder) {
binder.setValidator(new PersonValidator());
}
@RequestMapping(path = "/person", method = RequestMethod.PUT)
public ResponseEntity<Person> add(@Valid @RequestBody Person person) {
person = personService.save(person);
return ResponseEntity.ok().body(person);
}
}
Run Code Online (Sandbox Code Playgroud)
自定义验证器:
public class PersonValidator extends CustomValidatorBean {
@Override
public …Run Code Online (Sandbox Code Playgroud) 我希望能够将图像上传到服务器,优雅地处理错误和异常,并在表单中向用户显示错误消息,理想情况下只使用现有准系统Spring Boot和Thymeleaf安装.
使用示例项目gs- uploaded -files我可以使用Spring Boot和Thymeleaf将文件上传到服务器.在application.properties我设置spring.http.multipart.max-file-size=1MB和
spring.http.multipart.max-request-size=1MB.但是,当我上传大于1MB的文件时,有几个安全和验证问题无法解决.
任何文件都可以上传.例如,可以上载html文件,从而托管在服务器上.文件如何受类型限制?可以在发送请求之前在页面中验证它们吗?如果我有多种上传图片的方式,我如何验证所有MultipartFiles?
用户可以尝试上传大文件,超出Spring的默认限制和嵌入式Tomcat.这导致org.springframework.web.multipart.MultipartExceptionSpring不处理.如何在上传尝试之前验证文件大小?如果这是bypassesed可以任何文件上传Spring捕获的异常,以便显示一个很好的错误消息?
默认的Spring错误页面不用作所有异常的回退.MultipartException返回带有完整堆栈跟踪的Tomcat异常页面(请参阅日志1).
我已经搜索过,试图找到并实现一套解决方案.
修正数字1的一步是修改handleFileUpload内容类型,拒绝未通过的文件: !file.getContentType().toLowerCase().startsWith("image").这总是有效吗?恶意用户可以绕过这个吗?我如何检查每个MultipartFile,以节省每次添加它的时间?
@PostMapping("/")
public String handleFileUpload(@RequestParam("file") MultipartFile file, RedirectAttributes redirectAttributes)
throws MultipartException, IllegalStateException {
if (file != null && file.getContentType() != null && !file.getContentType().toLowerCase().startsWith("image"))
throw new MultipartException("not img");
storageService.store(file);
redirectAttributes.addFlashAttribute("message",
"You successfully uploaded " + file.getOriginalFilename() + "!");
return "redirect:/";
}
Run Code Online (Sandbox Code Playgroud)
添加一个@ExceptionHandler不起作用,它永远不会被调用.
@ExceptionHandler({ SizeLimitExceededException.class, MultipartException.class,
java.lang.IllegalStateException.class })
public ModelAndView handleError(HttpServletRequest req, Exception e) {
// error("Request: " …Run Code Online (Sandbox Code Playgroud)