Spring Boot文件上传下载+全局异常处理+拦截器

Spring Boot对页面参数的接收注意事项

1. 接收日期类型的参数
  • 前端页面
<input type="date" name="pressDate" class="el-input__inner">
  • 实体类

对于接收日期类的参数,实体类的属性上应加上@DateTimeFormat注解,并指定接收日期的格式

@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date pressDate;
2. 接收数值类型的参数
  • 前端页面
<input type="number" name="wordNum" class="el-input__inner">
  • 实体类

注意,接收number类型的参数,实体类的属性应用Integer类型,而不能用int基础类型

private Integer wordNum;

Spring Boot文件上传

配置文件
spring:
http:
  multipart:
    max-request-size: 10MB #用来控制文件上传大小的限制
    max-file-size: 10MB #用来指定服务端最大文件大小
前端页面

注意:method为“POST”,enctype为“multipart/form-data”,后台接收参数名称与“name”相同。

<form action="" method="post" enctype="multipart/form-data">
	<input type="file" name="coverFile">
</form>
Spring Boot的Controller代码
/**
 * 添加图书
 * @param book
 * @return
 */
@RequestMapping("addBook")
public String addBook(Book book, MultipartFile coverFile, HttpServletRequest request) throws IOException {
    //对上传的文件进行处理
    if (!coverFile.isEmpty()) {
        //获取封面保存路径的绝对地址
        String realPath = request.getSession().getServletContext().getRealPath("/cover");
        //获取文件后缀(如“.jpg”)
        int suffixIndex = coverFile.getOriginalFilename().lastIndexOf(".");
        String suffix = coverFile.getOriginalFilename().substring(suffixIndex);
        //创建图片的新文件名
        String newFileName = UUID.randomUUID().toString().replaceAll("-", "") + suffix;
        //将文件保存到指定路径
        coverFile.transferTo(new File(realPath, newFileName));
        book.setCover("/cover/" + newFileName);
    }
    bookService.add(book);
    return "redirect:/book/showAll";
}

Spring Boot文件下载

Jsp页面
<a href="${pageContext.request.contextPath}/book/pictureDownload?id=${book.id}">
<img width="32px" height="20px" src="${pageContext.request.contextPath}${book.cover}" >
</a>
Spring Boot代码

注意:根据笔者的亲自测试,对于响应头的设置,Spring Boot对于attachmentinline的效果都是“预览”

/**
 * 下载书籍封面图片
 * @param id 图书ID
 */
@RequestMapping("pictureDownload")
public void pictureDownload(String id, HttpServletRequest request, HttpServletResponse response) throws IOException {
    //获取图书封面的绝对路径
    Book book = bookService.queryById(id);
    String cover = book.getCover();
    String realPath = request.getSession().getServletContext().getRealPath(cover);
    //获取文件输入流
    FileInputStream is = new FileInputStream(realPath);
    //获取输出流
    ServletOutputStream os = response.getOutputStream();
    //设置响应的头(attachment为附件,inline为在线预览)
    response.setHeader("content-disposition", "inline:fileName="+ URLEncoder.encode(book.getName(), "UTF-8"));
    //将is流交给os流
    IOUtils.copy(is, os);
    //关闭IO流
    IOUtils.closeQuietly(is);
    IOUtils.closeQuietly(os);
}
效果

图片预览

Spring Boot全局异常处理

自定义全局异常处理类
package ace.gjh.exception;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.Date;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = Exception.class)
    public ModelAndView defaultErrorHandler(Exception e, HttpServletRequest request){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("exception", e);
        modelAndView.addObject("url", request.getRequestURL());
        modelAndView.addObject("timestamp",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        modelAndView.addObject("error", e);
        modelAndView.addObject("status", "error");
        modelAndView.addObject("message", "error");
        modelAndView.setViewName("global_error");

        return modelAndView;
    }

}
自定义全局异常处理页面

global_error.jsp

<%@page isELIgnored="false" language="java" contentType="text/html; UTF-8" pageEncoding="utf-8" %>
<html>
<head>
    <title>Error</title>
</head>
<body style="background-color: #b0fffc">
<div style="width: 750px;border: #d31fb4 1px solid;margin: 200px auto;padding: 30px">
    <h1>温馨提示</h1>
    <font color="blue">${timestamp}&nbsp;&nbsp;${url}</font> <br>
    出现如下异常:<br>
    <font color="red">${exception}</font>
</div>
</body>
</html>
显示效果

全局异常拦截

Spring Boot利用拦截器实现用户登录验证

实现拦截器
package ace.gjh.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginInterceptor implements HandlerInterceptor {

    /**
     * 在请求处理之前调用,决定是否调用该拦截链中的方法
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
        Object admin = request.getSession().getAttribute("admin");
        return admin == null;
    }

    /**
     * 在请求被处理后,视图渲染之前调用
     */
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        modelAndView.setViewName("back/login");
    }

    /**
     * 在整个请求处理完成之后调用的方法
     */
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

    }
}
注册拦截器
package ace.gjh.interceptor;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Component
public class LoginInterceptorConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/book/*")
                .addPathPatterns("/category/*");
    }
}
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/book/*")
                .addPathPatterns("/category/*");
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭建華

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值