SpringMVC的文件上传和拦截器
目录
一、文件上传
1.概述
2.案例1
3.案例2
二.拦截器
1.HandlerInterceptor接口
2.案例:拦截器实现用户权限验证
一、文件上传
1.概述
SpringMVC会将上传文件绑定到MultipartFile对象中。MultipartFile提供了获取上传文件内容、方法名等方法。通过transferTo()方法还可以将文件存储到硬件中。
方法 | 描述 |
---|---|
byte[] getBytes() | 获取文件数据 |
String getContentType() | 获取文件MIME类型,如image/jpeg等 |
InputStream getInputStream() | 获取文件流 |
String getName() | 获取表单中文件组件的名字 |
String getOriginalFilename() | 获取上传文件的原名 |
long getSize() | 获取文件的字节大小 |
boolean isEmpty() | 是否有上传的文件 |
void transferTo(File dest) | 将上传文件保存到一个目标文件中 |
Spring MVC 上下文中默认没有装配 MultipartResovler,因此默认情况下不能处理文件的上传工作,如果想使用 Spring 的文件上传功能,需现在上下文中配置 MultipartResolver
2.案例1
uploadForm.jsp
<form action="upload" enctype="multipart/form-data" method="post">用户名:<input type="text" name="username"><br/>请上传头像:<input type="file" name="image"><br/><input type="submit" value="提交"></form>
FileUploadController.java
@RequestMapping("/upload")public String upload(HttpServletRequest request,@RequestParam("username") String username, @RequestParam("image") MultipartFile image, Model model) throws Exception {System.out.println(username);//如果文件不为空if (!image.isEmpty()) {//上传文件路径String path = request.getServletContext().getRealPath("/images");System.out.println("path:" + path);//上传文件名String filename = image.getOriginalFilename();System.out.println("filename:" + filename);File filepath = new File(path, filename);//判断路径是否存在,如果不存在就创建一个if (!filepath.getParentFile().exists()) {filepath.getParentFile().mkdirs();}//将上传文件保存到一个目标文件中image.transferTo(new File(path + File.separator + filename));//跳转到下载页面return "success";} else {return "error";}}
dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 默认使用基于注释的适配器和映射器 --><mvc:annotation-driven/><!-- 只把动态信息当做controller处理,忽略静态信息 --><mvc:default-servlet-handler/><!--自动扫描包中的Controlller --><context:component-scan base-package="com.itheima.controller"/><!-- 配置视图解析器: 如何把 handler 方法返回值解析为实际的物理视图 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"/><!-- 前缀 --><property name="suffix" value=".jsp"/><!-- 后缀,自动拼接 --></bean>
<!-- 配置 MultipartResolver --><bean id="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!-- 上传文件大小上限 --><property name="defaultEncoding" value="UTF-8"></property><!-- 请求的编码格式,必须和jsp的pageEncoding属性一致 --><property name="maxUploadSize" value="1024000"></property></bean>
</beans>
3.案例2
FileUploadController.java
@Controller
public class FileUploadController {@RequestMapping("/fileUpload")public String fileUpload(String picname, MultipartFile uploadFile, HttpServletRequest request) {System.out.println(uploadFile);//判断是否上传了文件if (!uploadFile.isEmpty()) {//上传文件路径//定义文件名String fileName = "";//获取文件原始名String originalFilename = uploadFile.getOriginalFilename();System.out.println("originalFilename" + originalFilename);//截取文件拓展名String extendName = originalFilename.substring(originalFilename.lastIndexOf("." )+1);System.out.println("extendName:" + extendName);String uuid = UUID.randomUUID().toString().replace("-", "").toLowerCase();//判断用户是否输入了文件名if (!StringUtils.isEmpty(picname)) {fileName = uuid + "_" + picname + "." + extendName;} else {fileName = uuid + "_" + originalFilename;}//获取文件路径String path = request.getSession().getServletContext().getRealPath("/uploads");System.out.println(path);//解决一个文件夹目录过多的问题//根据fileName计算出hashCode值int hashCode = fileName.hashCode();//生成两级目录int x = hashCode & 0xf;int y = hashCode & 0xf0 >> 4;File file = new File(path + File.separator + x + File.separator + y);System.out.println("file:"+file.getName());//判断文件夹是否存在if (!file.exists()) {file.mkdirs();}try {//将上传文件保存到一个目标文件中uploadFile.transferTo(new File(file, fileName));} catch (IOException e) {throw new RuntimeException(e);}}return "success";}
}
FileUpload.jsp
<form action="/fileUpload" method="post" enctype="multipart/form-data">名称:<input type="text" name="picname"/><br/>图片:<input type="file" name="uploadFile"/><br/><input type="submit" value="上传"/></form>
</body>
二.拦截器
1.HandlerInterceptor接口
SpringMVC中的Interceptor拦截器拦截请求是通过实现HandlerInterceptor接口来完成的。若要自定义一个拦截器,只需要实现HandlerInterceptor接口或者继承抽象类HandlerInterceptorAdapter。
HandlerInterceptor接口中定义了三个方法
方法 | 描述 |
---|---|
preHandle(request,response) | 在请求处理之前被调用 |
postHandle(request,response) | 在Controller方法被调用之后,视图返回渲染之前被调用 |
afterCompletion(request,response) | 在视图返回渲染之前被调用,一般用来资源清理 |
2.案例:拦截器实现用户权限验证
用户必须登录之后才可以访问到网站首页,如果没有登录,则跳转到登陆页面,并提示错误消息
loginForm.jsp
<font color="red">${requestScope.message}</font><br/>
<form action="login" method="post">
登录名:<<input type="text" name="loginname" id="loginname"><br/>
密码:<<input type="text" name="password" id="password"><br/>
<input type="submit" value="登陆">
</form>
UserController.java
@RequestMapping("/{formName}")public String loginForm(@PathVariable String formName, Model model) {//model.addAttribute("user1",new User1());//动态跳转页面return formName;}
@RequestMapping("/login")public ModelAndView login(String loginname, String password, ModelAndView modelAndView, HttpSession session){//模拟数据库查找判断是否有该用户名及密码if(loginname!=null&&loginname.equals("admin")&&password!=null&&password.equals("123456")){//模拟创建用户Admin admin=new Admin(loginname,password);//登陆成功,将admin对象设置到HttpSession域对象中session.setAttribute("admin",admin);//转发到main请求modelAndView.setViewName("redirect:main");}else{//登录失败,设置失败信息,跳转到登陆页面modelAndView.addObject("message","用户名或密码错误");
modelAndView.setViewName("loginForm");}return modelAndView;}
@RequestMapping("/main")public String main(Model model){//模拟数据库获得所有图书List<Book> book_list=new ArrayList<>();book_list.add(new Book("Spring实战",58));book_list.add(new Book("深入浅出MyBatis",69));book_list.add(new Book("java并发编程实战",77));model.addAttribute("book_list",book_list);return "main";}
main.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:forEach items="${requestScope.book_list}" var="book">${book.name}<br/>${book.price}<br/><hr/>
</c:forEach>
AuthorizationInterceptor.java
package com.itheima.interceptor;import com.itheima.domain.Admin;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class AuthorizationInterceptor implements HandlerInterceptor {//不拦截的请求private static final String[] IGNORE_URI={"/loginForm","/login"};@Overridepublic boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {boolean flag=false;String servletPath= httpServletRequest.getServletPath();//判断请求是否需要拦截for (String s : IGNORE_URI) {if(servletPath.contains(s)){flag=true;break;}}if(!flag){//1.获取session中的用户Admin admin=(Admin)httpServletRequest.getSession().getAttribute("admin");//2.判断用户是否登陆if(admin==null){httpServletRequest.setAttribute("message","请先登录");httpServletRequest.getRequestDispatcher("loginForm").forward(httpServletRequest,httpServletResponse);}else{flag=true;}}return flag;}@Overridepublic void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {System.out.println("postHandler...");}@Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {System.out.println("afterCompletion...");}
}
dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 默认使用基于注释的适配器和映射器 --><mvc:annotation-driven/><!-- 只把动态信息当做controller处理,忽略静态信息 --><mvc:default-servlet-handler/><!--自动扫描包中的Controlller --><context:component-scan base-package="com.itheima.controller"/><!-- 配置视图解析器: 如何把 handler 方法返回值解析为实际的物理视图 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"/><!-- 前缀 --><property name="suffix" value=".jsp"/><!-- 后缀,自动拼接 --></bean> <!-- SpringMVC拦截器定义--><mvc:interceptors><mvc:interceptor><!-- 拦截所有请求 --><mvc:mapping path="/**"/><!-- 用于指定排除的url --><!-- 还可以直接在配置文件中指定排除的url,不在拦截器中判断<mvc:exclude-mapping path="/loginForm"/><mvc:exclude-mapping path="/login"/> --><bean class="com.itheima.interceptor.AuthorizationInterceptor"></bean></mvc:interceptor></mvc:interceptors>
SpringMVC的文件上传和拦截器相关推荐
- 【SSM框架系列】SpringMVC的文件上传、拦截器及异常处理
SpringMVC的文件上传 服务器端实现文件上传的技术有很多种,Servlet3.0,FileUtils,框架等等,都可以实现文件上传,不管使用哪一种上传技术,都必须满足三要素: 表单项type=& ...
- SpringMVC处理Json、文件上传、拦截器
SpringMVC处理Json.文件上传.拦截器 : 处理JSON 链接 http://repo1.maven.org/maven2/com/fasterxml/jackson/core/ 步骤 编写 ...
- 04springMVC结构,mvc模式,spring-mvc流程,spring-mvc的第一个例子,三种handlerMapping,几种控制器,springmvc基于注解的开发,文件上传,拦截器,s
1. Spring-mvc介绍 1.1市面上流行的框架 Struts2(比较多) Springmvc(比较多而且属于上升的趋势) Struts1(即将被淘汰) 其他 1.2 spring-mv ...
- springmvc 文件上传和拦截器
文件上传: 单文件: @Controller public class FirstController {@RequestMapping("/first")public Strin ...
- SpringBoot→请求参数、返回参数、文件上传、拦截器、异常处理、定时任务、异步任务
web请求static静态资源 localhost:8080/cat.png localhost:8080/test.html localhost:8080/abc/test.html localho ...
- java day62【 响应数据和结果视图 、 SpringMVC 实现文件上传 、 SpringMVC 中的异常处理 、 SpringMVC 中的拦截器 】...
第1章 响应数据和结果视图 1.1返回值分类 1.1.1 字符串 1.1.2 void 1.1.3 ModelAndView 1.2转发和重定向 1.2.1 forward 转发 1.2.2 Redi ...
- SpringMVC入门(二)—— 参数的传递、Controller方法返回值、json数据交互、异常处理、图片上传、拦截器
SpringMVC入门(二)-- 参数的传递.Controller方法返回值.json数据交互.异常处理.图片上传.拦截器 参考文章: (1)SpringMVC入门(二)-- 参数的传递.Contro ...
- SpringMVC学习--文件上传
简介 文件上传是web开发中常见的需求之一,springMVC将文件上传进行了集成,可以方便快捷的进行开发. springmvc中对多部件类型解析 在 页面form中提交enctype="m ...
- SpringMVC+uploadify文件上传
前言 准备筹划一个自己的个人网站,初步的架构设计采用SSH(Spring-MVC,Spring,Hibernate),在这里 顺便记录一下设计和开发过程,以备参考.后续会陆续更新文档,如有任何问题,欢 ...
最新文章
- 基于策略的路由(下)
- mysql数据库安全配置规范_MySQL数据库安全配置规范操作
- 从身体扮演到身份确认:谈谈EMI的人体自拍作品
- Delphi 26 岁
- linux ps 详解 博客,Linux PS 命令 详解(转)
- python 聚类_聚类算法中的四种距离及其python实现
- python numpy修改数据维度
- 运行linux的配置,Linux系统运行级别配置
- 部署Docker前必须问自己的四个问题
- js 连mysql 延后_详解MySQL 主从同步延迟
- 设计模式学习--迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)
- php网站怎么优化,如何优化你的Z-BlogPHP网站
- 机器学习之特征选择方法
- sublime php测试,sublime phpcs代码检查配置
- 有限元法基本思想和分类
- 大话布隆过滤器及其应用场景
- Android studio Gradle:Executing tasks - 一直卡在Gradle:Build Running
- GPT分区规划与各分区作用解析
- 记一次突如其来的小米前端面试
- Gobelieve 架构(转载)