相关疑难解决方法(0)

使用JSR-303和Spring的Validator的组合为Spring引导端点实现自定义验证逻辑

我试图实现使用的组合弹簧引导终点一些自定义的验证逻辑JSR-303 Bean Validation APISpring's Validator.

基于Validator类图,似乎可以扩展其中一个CustomValidatorBean,SpringValidatorAdapter或者LocalValidatorFactoryBean将一些自定义验证逻辑添加到重写方法中validate(Object target, Errors errors).

验证器类图.

但是,如果我创建一个验证器来扩展这三个类中的任何一个并使用@InitBindervalidate(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)

java validation spring bean-validation spring-boot

7
推荐指数
2
解决办法
2万
查看次数

Spring Boot中的文件上传:上传,验证和异常处理

我希望能够将图像上传到服务器,优雅地处理错误和异常,并在表单中向用户显示错误消息,理想情况下只使用现有准系统Spring Boot和Thymeleaf安装.

使用示例项目gs- uploaded -files我可以使用Spring Boot和Thymeleaf将文件上传到服务器.在application.properties我设置spring.http.multipart.max-file-size=1MBspring.http.multipart.max-request-size=1MB.但是,当我上传大于1MB的文件时,有几个安全和验证问题无法解决.

  1. 任何文件都可以上传.例如,可以上载html文件,从而托管在服务器上.文件如何受类型限制?可以在发送请求之前在页面中验证它们吗?如果我有多种上传图片的方式,我如何验证所有MultipartFiles?

  2. 用户可以尝试上传大文件,超出Spring的默认限制和嵌入式Tomcat.这导致org.springframework.web.multipart.MultipartExceptionSpring不处理.如何在上传尝试之前验证文件大小?如果这是bypassesed可以任何文件上传Spring捕获的异常,以便显示一个很好的错误消息?

  3. 默认的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)

java tomcat file-upload thymeleaf spring-boot

5
推荐指数
2
解决办法
4730
查看次数