SpringBoot 拦截器、文件上传

477 阅读2分钟

SpringBoot 拦截器

Spring MVC 的拦截器(Interceptor)与 Java Servlet 的过滤器(Filter)类似,它主要用于拦截用户的请求并做相应的处理,通常应用于权限验证,记录请求信息的日志,判断用户是否是登陆状态。

Spring MVC 中的自定义拦截器,可以通过实现 HandlerInterceptor 接口来定义。重点重写 preHandle() 方法。

preHandle():这个方法在业务处理器处理请求之前被调用,可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。该方法的返回值是布尔值 Boolean 类型的,当它返回为 false 时,表示请求结束,后续的 Interceptor 和 controller 都不会再执行;当返回值为 true 时就会继续调用下一个 Interceptor 的 preHandle() 方法,如果已经时最后一个 Interceptor 的时候就会是调用当前请求的 controller 方法。

定义拦截器:

public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //得到登陆用户
        Object obj = request.getSession().getAttribute("loginUser");
        if (obj == null){//没有登陆,回到登陆页
            response.sendRedirect("/login.html?errorInfo=noland");
            //没有通过,不能继续访问目标资源
            return false;
        }
        //通过拦截器,继续访问目标资源
        return true;
    }
}

注册拦截器:

拦截器定义后,必须要完成注册,才能被 spring MVC 容器所识别。在注册时,需要指定拦截范围。

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())//注册拦截器
                .addPathPatterns("/home.html");//定义拦截范围
    }
}

文件上传

文件上传是将客户本地的文字、图片、视频等上传给 Web 服务器。

文件上传,要求客户端必须以 POST 方式提交,并在表单中添加 enctype="multipart/form-data" 属性。

<form action="/user/add" method="post" enctype="multipart/form-data">
    用户名:<input type="text" name="userName" id="userName"><br>
    头像:<input type="file" name="face" id="face"><br>
    <input type="submit" value="提交">
</form>

在 application.yml 文件添加上传文件大小限制。

spring:
  servlet:
    multipart:
      maxFileSize: 20MB
      maxRequestSize: 100MB

在服务器端的 controller 中接受上传文件。

@RequestMapping("add")
public String add(String userName, @RequestParam("face") MultipartFile mf) throws IOException {
    //得到客户端上传文件的文件名
    String fileName = mf.getOriginalFilename();
    //将上传文件的二进制数据保存到服务器本地文件
    mf.transferTo(new File("F:/java base/javaWeb1/interceptor/src" +
            "/main/resources/static/userface/"+fileName));
    return "ok";
}

在配置类中,注册上传文件的路径映射。

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/face/**")
                .addResourceLocations("file:F:/java base/javaWeb1/interceptor/src" +
                        "/main/resources/static/userface/");
    }
}

上传头像:

用户名:<input type="text" id="userName"><br>
<img src="" id="facePic" width="200" height="200"><br>
头像:<input type="file" id="faceImg" onchange="fileChange()"><br>
<input type="button" value="添加" onclick="addUser()">
<script src="/js/axios.min.js"></script>
<script src="/js/query.js"></script>
<script>
    function addUser(){
        //创建上传文件对象
        let formObj = new FormData();
        //添加表单数据
        formObj.append("userName",$("userName").value);
        formObj.append("face",$("faceImg").files[0]);
​
        //设置请求头
        let config = {
            headers: {'Content-Type': 'multipart/form-data' }
        }
​
        axios.post("/user/add",formObj,config).then(resp =>{
            if (resp.data == "ok"){
                alert("添加成功")
            }
        })
    }
​
    function fileChange(){
        var reader = new FileReader();//定义文件读取流对象
        reader.readAsDataURL($("faceImg").files[0]);
        reader.onload = function (ev) {
            $("facePic").src = ev.target.result;
        }
    }
</script>

\