KKB:Spring 拦截器、拦截器和过滤器的联系、spring-MVC文件的上传和下载

先看看 源码,分析一下拦截器,下面的源码是doDispatcher()方法

配置拦截器:

1、创建拦截器的类,实现HandlerInterceptor,重写三个方法:开始执行(return 需修改为true)、结束执行、最终执行

2、spring-mvc中配置拦截器

下面写法表示的是拦截所有的请求,所有的请求都需要走这个拦截器

启动服务器,测试

我们修改拦截器,对需要拦截的请求进行拦截

拦截器的问题深入

当有多个拦截器的时候,执行顺序是怎么样的呢?

项目测试


拦截器的使用场景

1、日志记录:记录请求信息的日志

2、权限检查,如登录检查

3、性能检测:检测方法的执行时间


springMVC的拦截器(Interceptor)和 过滤器(Filter)的区别和联系

拦截器属于面向切面编程的一种运用,将两个不关联的类通过配置文件关联起来,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理

过滤器:修改字符编码,过滤低俗文字、危险字符

用户发送的请求 首先经过的是过滤器,然后才是拦截器。出的时候,最先出的是拦截器,然后才是过滤器


spring-MVC文件的上传和下载

 

1、添加jar包

<dependency> 
    <groupId>commons-fileupload</groupId> 
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version> 
</dependency> 
<dependency> 
    <groupId>commons-io</groupId> 
    <artifactId>commons-io</artifactId> 
    <version>2.4</version> 
</dependency>

2、配置spring.xml文件(使用了P标签)

3、编写前端代码,指定上传的文件

4、编写代码接收前端传过来的上传文件

package com.atshiyou.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;

@Controller
public class UploadController {
    @RequestMapping("upload")
    public String upload(MultipartFile myfile, HttpServletRequest request){
        //处理上传的文件内容
        //将上传的文件夹转化成服务器上的路径
        String realPath = request.getRealPath("/uploadImage");
        System.out.println("realPath="+realPath);
        //得到上传的文件名
        String originalFilename = myfile.getOriginalFilename();
        System.out.println("文件的名称:"+originalFilename);
        //准备上传
        try {
            myfile.transferTo(new File(realPath+"/"+originalFilename));
        } catch (IOException e) {
            e.printStackTrace();
        }
        request.getSession().setAttribute("filename",originalFilename);
        return "uploadsuccess";
    }
}

 

注意,这里很容易会报服务器错误

当上传的目录文件夹uploadimage为空的时候,不会编译进入target文件夹,这时候,我们需要随便加一个文件


springMVC中实现文件的下载

 

1、添加 jar包,上传的jar包的其中一个

2、编写前端的代码,使用的是 ? 拼接文件名

3、编写controller

package com.atshiyou.controller;

import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.net.URLEncoder;

@Controller
public class DownloadController {
    @RequestMapping("/download")
    public ResponseEntity<byte[]> download(String filename, HttpServletRequest request)throws Exception{
        //下载结果以流的方式返回给前台
        //1、转换服务器地址
        String realPath = request.getRealPath("/uploadImage");
        //2.得到要下载的文件路径
        String filePath = realPath + "/" + filename;
        //3、设置响应的头信息
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        //给用户弹窗的方式进行下载
        //attachment:用来表示以附件的形式响应给客户端
        httpHeaders.setContentDispositionFormData("attachment", URLEncoder.encode(filename,"utf-8"));
        //创建文件
        File file = new File(filePath);
        //将文件进行返回
        ResponseEntity<byte[]> responseEntity = new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),httpHeaders, HttpStatus.CREATED);
        return responseEntity;
    }
}

测试可用

猜你喜欢

转载自blog.csdn.net/awodwde/article/details/112972002