目录

一、文件上传

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的文件上传和拦截器相关推荐

  1. 【SSM框架系列】SpringMVC的文件上传、拦截器及异常处理

    SpringMVC的文件上传 服务器端实现文件上传的技术有很多种,Servlet3.0,FileUtils,框架等等,都可以实现文件上传,不管使用哪一种上传技术,都必须满足三要素: 表单项type=& ...

  2. SpringMVC处理Json、文件上传、拦截器

    SpringMVC处理Json.文件上传.拦截器 : 处理JSON 链接 http://repo1.maven.org/maven2/com/fasterxml/jackson/core/ 步骤 编写 ...

  3. 04springMVC结构,mvc模式,spring-mvc流程,spring-mvc的第一个例子,三种handlerMapping,几种控制器,springmvc基于注解的开发,文件上传,拦截器,s

     1. Spring-mvc介绍 1.1市面上流行的框架 Struts2(比较多) Springmvc(比较多而且属于上升的趋势) Struts1(即将被淘汰) 其他 1.2  spring-mv ...

  4. springmvc 文件上传和拦截器

    文件上传: 单文件: @Controller public class FirstController {@RequestMapping("/first")public Strin ...

  5. SpringBoot→请求参数、返回参数、文件上传、拦截器、异常处理、定时任务、异步任务

    web请求static静态资源 localhost:8080/cat.png localhost:8080/test.html localhost:8080/abc/test.html localho ...

  6. 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 ...

  7. SpringMVC入门(二)—— 参数的传递、Controller方法返回值、json数据交互、异常处理、图片上传、拦截器

    SpringMVC入门(二)-- 参数的传递.Controller方法返回值.json数据交互.异常处理.图片上传.拦截器 参考文章: (1)SpringMVC入门(二)-- 参数的传递.Contro ...

  8. SpringMVC学习--文件上传

    简介 文件上传是web开发中常见的需求之一,springMVC将文件上传进行了集成,可以方便快捷的进行开发. springmvc中对多部件类型解析 在 页面form中提交enctype="m ...

  9. SpringMVC+uploadify文件上传

    前言 准备筹划一个自己的个人网站,初步的架构设计采用SSH(Spring-MVC,Spring,Hibernate),在这里 顺便记录一下设计和开发过程,以备参考.后续会陆续更新文档,如有任何问题,欢 ...

最新文章

  1. 基于策略的路由(下)
  2. mysql数据库安全配置规范_MySQL数据库安全配置规范操作
  3. 从身体扮演到身份确认:谈谈EMI的人体自拍作品
  4. Delphi 26 岁
  5. linux ps 详解 博客,Linux PS 命令 详解(转)
  6. python 聚类_聚类算法中的四种距离及其python实现
  7. python numpy修改数据维度
  8. 运行linux的配置,Linux系统运行级别配置
  9. 部署Docker前必须问自己的四个问题
  10. js 连mysql 延后_详解MySQL 主从同步延迟
  11. 设计模式学习--迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)
  12. php网站怎么优化,如何优化你的Z-BlogPHP网站
  13. 机器学习之特征选择方法
  14. sublime php测试,sublime phpcs代码检查配置
  15. 有限元法基本思想和分类
  16. 大话布隆过滤器及其应用场景
  17. Android studio Gradle:Executing tasks - 一直卡在Gradle:Build Running
  18. GPT分区规划与各分区作用解析
  19. 记一次突如其来的小米前端面试
  20. Gobelieve 架构(转载)

热门文章

  1. 现代密码学3.4--CPA安全,多次加密
  2. 计算机相关专业学习经验总结
  3. django中模型类的创建
  4. [How TO]-图解virtualbox下安装ubuntu20.04虚拟机
  5. KTHREAD 结构体属性介绍
  6. IO和属性配置文件之组合拳
  7. 【Shell】使用记录
  8. 11、MySQL常见错误代码一览表
  9. 9、MySQL中SQL语句的大小写规则
  10. getId()方法的作用