文章目录
1、拦截器
1.1 拦截器概念
类似于JavaWeb中的Filter过滤器,用于过滤请求,可以对不符合要求的请求进行拦截
拦截器和过滤器的区别:
- 过滤器的使用范围比拦截器大,JavaWeb项目都可以使用,拦截器只能在SpringMVC使用
- 拦截器效率高于过滤器
- 拦截器是基于java的反射机制的,而过滤器是基于函数回调
- 拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
1.2 拦截器的使用
1) 实现HandlerInterceptor接口
2)实现方法
-
preHandle 前置处理
-
postHandle 后置处理
-
afterCompletion 完成后处理
/**
* 登录拦截器
*/
public class LoginInterceptor implements HandlerInterceptor {
/**
* 前置处理
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//查询session是否保存用户
User user = (User) request.getSession().getAttribute("user");
if(user == null){
//没有登录,重定向到login页面
response.sendRedirect("/pages/login");
//返回false,拦截
return false;
}
//返回true,放行
return true;
}
}
3) 配置拦截器
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--配置拦截的URL请求路径 /**代表所有请求-->
<mvc:mapping path="/**"/>
<!--配置不拦截的请求路径-->
<mvc:exclude-mapping path="/**/login"/>
<mvc:exclude-mapping path="/**/*.css"/>
<mvc:exclude-mapping path="/**/*.js"/>
<mvc:exclude-mapping path="/**/*.png"/>
<mvc:exclude-mapping path="/**/*.jpg"/>
<!--配置class-->
<bean class="com.blb.bookms.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
2、文件上传下载
2.1 文件上传
文件上传分为两种方式:
-
传统的Servlet文件上传
-
SpringMVC文件上传
2.1.1 传统的Servlet文件上传
1)导入依赖
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
2)编写表单
表单文件上传的三个要素:
- form标签要添加enctype=“multipart/form-data”
- 提交方法为post
- input类型为file
<form action="/upload" method="post" enctype="multipart/form-data">
...
<input type="file" name="file" >
...
</form>
2)上传方法
@Controller
public class UploadController {
@RequestMapping("/upload")
public String fileupload(HttpServletRequest request) throws Exception {
//获取项目的upload目录路径
String path= request.getSession().getServletContext().getRealPath("/upload/");
File file=new File(path);
//判断文件夹是否存在
if (!file.exists()){
//创建文件夹
file.mkdirs();
}
//创建上传对象
ServletFileUpload upload=new ServletFileUpload(new DiskFileItemFactory());
//获得文件列表
List<FileItem> fileItems= upload.parseRequest(request);
for (FileItem item:fileItems){
//判断文件是不是普通表单项
if (item.isFormField()){
//如果是普通表单项,打印表单项名和值
System.out.println(item.getFieldName());
System.out.println(item.getString());
}else{
//如果是文件,截取后缀名
String filename= item.getName();
String suffix = filename.substring(filename.lastIndexOf("."));
//创建唯一的文件名
String uuid= UUID.randomUUID().toString().replace("-","");
filename = uuid + suffix;
//完成文件上传
item.write(new File(path,filename));
System.out.println("上传完毕");
}
}
//跳转到success页面
return "success";
}
2.1.2 SpringMVC文件上传
依赖和上面一样
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="upload" >
<button>上传</button>
</form>
上传方法中使用MultipartFile参数获得上传文件
@RequestMapping("/upload")
public String fileupload(HttpServletRequest request, MultipartFile upload) throws Exception {
//获取项目目录下的upload目录路径
String path = request.getSession().getServletContext().getRealPath("/upload/");
System.out.println(path);
File file = new File(path);
if (!file.exists()) {
file.mkdirs();
}
//获取上传文件名字
String filename = upload.getOriginalFilename();
String suffix = filename.substring(filename.lastIndexOf("."));
//创建唯一的文件名
String uuid= UUID.randomUUID().toString().replace("-","");
filename = uuid + suffix;
//完成文件上传
upload.transferTo(new File(path,filename));
return "success";
}
必须需要在springmvc的配置中添加上传处理器
<!--上传处理器-->
<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver">
<!--上传文件最大字节数-->
<property name="maxUploadSize" value="10485760"/>
</bean>
2.1.3 SpringMVC多文件上传
给表单添加多个文件项
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="uploads">
<input type="file" name="uploads">
<input type="file" name="uploads">
<input type="submit" value="MVC多文件上传">
</form>
添加MultipartFile数组为参数,参数名和表单name一致
@RequestMapping("/upload3")
public String fileupload3(HttpServletRequest request, MultipartFile[] uploads) throws Exception {
//获取tomcat项目目录下的upload目录路径
String path = request.getSession().getServletContext().getRealPath("/upload/");
System.out.println(path);
File file = new File(path);
if (!file.exists()) {
file.mkdirs();
}
for(MultipartFile upload : uploads) {
//获取上传文件名字
String filename = upload.getOriginalFilename();
String suffix = filename.substring(filename.lastIndexOf("."));
//创建唯一的文件名
String uuid = UUID.randomUUID().toString().replace("-", "");
filename = uuid + "-" + suffix;
//完成文件上传
upload.transferTo(new File(path, filename));
}
return "success";
}
2.1.4 SpringMVC其它上传类
SpringMVC还提供了其它API支持上传:
- CommonsMultipartResolver 多部分解析器,用于判断请求是否存在上传文件
- MultipartHttpServletRequest 多部分请求,用于获得文件相关信息
具体用法:
@RequestMapping("upload4")
public String fileupload4(HttpServletRequest request) throws IllegalStateException, IOException
{
String path = request.getSession().getServletContext().getRealPath("/upload/");
//创建多部分解析器
CommonsMultipartResolver multipartResolver=new CommonsMultipartResolver(
request.getSession().getServletContext());
//检查表单是否支持文件上传
if(multipartResolver.isMultipart(request)){
//将请求转换为多部分请求,支持上传
MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest)request;
//获取请求中所有的文件名
Iterator iter=multiRequest.getFileNames();
while(iter.hasNext()) {
//遍历所有文件
MultipartFile file=multiRequest.getFile(iter.next().toString());
if(file!=null) {
//获取上传文件名字
String filename = file.getOriginalFilename();
String suffix = filename.substring(filename.lastIndexOf("."));
//创建唯一的文件名
String uuid = UUID.randomUUID().toString().replace("-", "");
filename = uuid + suffix;
//上传
file.transferTo(new File(path,filename));
}
}
}
return "success";
}
2.2 文件下载
/**
* 下载控制器
*/
@Controller
public class DownloadController {
@RequestMapping("download")
public void download(String file, HttpServletResponse response) throws IOException {
//下载文件的路径
String path = "D:\\install\\";
File downFile = new File(path+file);
if(downFile.exists()){
//设置浏览器下载内容类型,响应头
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition","attachment;filename="+file);
//通过流发送文件
Files.copy(downFile.toPath(),response.getOutputStream());
}
}
}