先看看 源码,分析一下拦截器,下面的源码是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;
}
}
测试可用