SpringMVC拦截器,上传,下载
SpringMVC拦截器,上传,下载
SpringMVC拦截器 基于反射,和sprig结合紧密,可以拿到ioc 容器的bean,不是基于servlet的,只会拦截springMVC请求
JSP里的过滤器 依赖于servlet 基于函数回调,基本拦截所有请求
SpringMVC拦截器(interceptor)
这篇博客的demo是基于我上一遍博客(SpringMVC 接受、处理Json,fastjson解析json,用Postman4发送json数据)的demo 感兴趣的朋友可以去看看
1.新建类SpringInterceptor 继承 HandlerInterceptor
public class SpringInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
//请求发往controller之前就执行这个函数了,返回true 才会执行controller,假如这个函数返回的是false 那么请求就此中断,要返回true,请求才会继续执行下去
//拦截用户请求是否合法 是否有违规字符 是否有sql注入
//自己加判断 符合条件之后就返回true
return true;
}
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
//controller处理完之后,调用这个函数
System.out.println("请求执行了");
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
//controller处理完之后,调用这个函数
System.out.println("请求执行了");
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
//请求完成后调用这个函数
System.out.println("请求处理完了");
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
//请求完成后调用这个函数
System.out.println("请求处理完了");
}
}
}
2.在spring-mvc.xml声明SpringMVC拦截器
<?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/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<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/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--加载解析json的组件 配置消息转换器-->
<mvc:annotation-driven>
<mvc:message-converters>
<bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<!--这里顺序不能反,一定要先写text/html 不然ie下会出现下载提示-->
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!--注意这里的顺序 一定要加载解析json的组件先加载 再开启springmvc的注解驱动 否则会报错,编译器也不会提示错误,很蛋疼-->
<!--开启springmvc的注解驱动-->
<mvc:annotation-driven/>
<!--配置包扫描-->
<context:component-scan base-package="com.dengweiquan.**" />
<!--开启springmvc的注解驱动-->
<mvc:annotation-driven/>
<!--配置包扫描-->
<context:component-scan base-package="com.dengweiquan.**" />
<!--配置viewResolver(视图解析器)-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--getrequestdispature的时候要填的前缀 和后准都自动填好 注意斜号很关键 漏填个斜号都会错-->
<property name="prefix" value="/WEB-INF/view/"/>
<property name="suffix" value=".jsp"/>
<!--jsp要用到jstl-->
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
</bean>
<!--声明SpringMVC拦截器-->
<mvc:interceptors>
<!--拦截所有请求-->
<!--<bean class="com.dengweiquan.interceptor.SpringInterceptor"/>-->
<!--拦截demo路径的请求 意思是只有请求demo路径的才能进到拦截器 -->
<mvc:interceptor>
<mvc:mapping path="/user/demo"/>
<bean class="com.dengweiquan.interceptor.SpringInterceptor"/>
</mvc:interceptor>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--getrequestdispature的时候要填的前缀 和后准都自动填好 注意斜号很关键 漏填个斜号都会错-->
<property name="prefix" value="/WEB-INF/view/"/>
<property name="suffix" value=".jsp"/>
<!--jsp要用到jstl-->
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
</bean>
<!--声明SpringMVC拦截器-->
<mvc:interceptors>
<!--拦截所有请求-->
<!--<bean class="com.dengweiquan.interceptor.SpringInterceptor"/>-->
<!--拦截demo路径的请求 意思是只有请求demo路径的才能进到拦截器 -->
<mvc:interceptor>
<mvc:mapping path="/user/demo"/>
<bean class="com.dengweiquan.interceptor.SpringInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
</beans>
访问 localhost:8080/user/demo
会输出:
请求执行了
请求处理完了
会输出:
请求执行了
请求处理完了
SpringMVC的文件上传和下载 :
文件上传和下载都是死套路,大体都是差不多的
引入第三方包:
commons-fileupload-1.3.1
commons-io-2.4
引入第三方包:
commons-fileupload-1.3.1
commons-io-2.4
1.在SpringMVC配置文件上传
<?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/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<?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/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--加载解析json的组件 配置消息转换器-->
<mvc:annotation-driven>
<mvc:message-converters>
<bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<!--这里顺序不能反,一定要先写text/html 不然ie下会出现下载提示-->
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!--注意这里的顺序 一定要加载解析json的组件先加载 再开启springmvc的注解驱动 否则会报错,编译器也不会提示错误,很蛋疼-->
<!--开启springmvc的注解驱动-->
<mvc:annotation-driven/>
<!--配置包扫描-->
<context:component-scan base-package="com.dengweiquan.**" />
<!--开启springmvc的注解驱动-->
<mvc:annotation-driven/>
<!--配置包扫描-->
<context:component-scan base-package="com.dengweiquan.**" />
<!--配置viewResolver(视图解析器)-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--getrequestdispature的时候要填的前缀 和后准都自动填好 注意斜号很关键 漏填个斜号都会错-->
<property name="prefix" value="/WEB-INF/view/"/>
<property name="suffix" value=".jsp"/>
<!--jsp要用到jstl-->
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
</bean>
<!--声明SpringMVC拦截器-->
<mvc:interceptors>
<!--拦截所有请求-->
<!--<bean class="com.dengweiquan.interceptor.SpringInterceptor"/>-->
<!--拦截demo路径的请求 意思是只有请求demo路径的才能进到拦截器 -->
<mvc:interceptor>
<mvc:mapping path="/user/demo"/>
<bean class="com.dengweiquan.interceptor.SpringInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--getrequestdispature的时候要填的前缀 和后准都自动填好 注意斜号很关键 漏填个斜号都会错-->
<property name="prefix" value="/WEB-INF/view/"/>
<property name="suffix" value=".jsp"/>
<!--jsp要用到jstl-->
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
</bean>
<!--声明SpringMVC拦截器-->
<mvc:interceptors>
<!--拦截所有请求-->
<!--<bean class="com.dengweiquan.interceptor.SpringInterceptor"/>-->
<!--拦截demo路径的请求 意思是只有请求demo路径的才能进到拦截器 -->
<mvc:interceptor>
<mvc:mapping path="/user/demo"/>
<bean class="com.dengweiquan.interceptor.SpringInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
<!--这个bean的id="multipartResolver" 一定不能写错,因为有专门处理文件上传的这个类-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--文件上传的过程中,在内存中可以占用多少 -->
<property name="maxInMemorySize" value="500000"/>
<!--上传文件时最大不能超过多少-->
<property name="maxUploadSize" value="500000"/>
<!--设置编码-->
<property name="defaultEncoding" value="UTF-8" />
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--文件上传的过程中,在内存中可以占用多少 -->
<property name="maxInMemorySize" value="500000"/>
<!--上传文件时最大不能超过多少-->
<property name="maxUploadSize" value="500000"/>
<!--设置编码-->
<property name="defaultEncoding" value="UTF-8" />
</bean>
</beans>
</beans>
2.修改UserController
@Controller
@RequestMapping("user")
public class UserController {
@RequestMapping("user")
public class UserController {
//假如是@RequestMapping("/test",method=RequestMethod.GET) 限制前端的请求,意思是前端只能发送GET请求
//假如是@RequestMapping("/test",method=RequestMethod.POST) 意思是前端只能发送POST请求
//要加上@RequestBody 才能json自动转对象
@RequestMapping("/test")
public String testUser(@RequestBody User user) {
//假如是@RequestMapping("/test",method=RequestMethod.POST) 意思是前端只能发送POST请求
//要加上@RequestBody 才能json自动转对象
@RequestMapping("/test")
public String testUser(@RequestBody User user) {
return "user";
}
@RequestMapping("/demo")
public String demoUser(){
//返回userspringmvc自动帮你加好了前后缀 就是我们要去的user.jsp 在viewResolver哪里已经配置好了路径的前后缀
return "demo";
}
@RequestMapping("/upload")
public String upload(MultipartFile file,HttpServletRequest request) throws IOException {
//拿到file的名称
String name=file.getOriginalFilename();
//拿到文件之后 存放在服务器的根目录下面
File uploadF=new File("/"+name);
file.transferTo(uploadF);
return "demo";
}
public String upload(MultipartFile file,HttpServletRequest request) throws IOException {
//拿到file的名称
String name=file.getOriginalFilename();
//拿到文件之后 存放在服务器的根目录下面
File uploadF=new File("/"+name);
file.transferTo(uploadF);
return "demo";
}
}
3.修改demo.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
这里是demo.jsp
<%--这里form表单里的input标签里的name 一定要是file 因为Controller里的upload方法里的MultipartFile的参数是file--%>
<form method="post" action="/user/upload" enctype="multipart/form-data">
<input type="text" name="id"/>
<input type="file" name="file"/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
<html>
<head>
<title>Title</title>
</head>
<body>
这里是demo.jsp
<%--这里form表单里的input标签里的name 一定要是file 因为Controller里的upload方法里的MultipartFile的参数是file--%>
<form method="post" action="/user/upload" enctype="multipart/form-data">
<input type="text" name="id"/>
<input type="file" name="file"/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
提交之后
上传成功 完结撒花O(∩_∩)O
SpringMVC下载:
1.修改UserController
@Controller
@RequestMapping("user")
public class UserController {
@Controller
@RequestMapping("user")
public class UserController {
//假如是@RequestMapping("/test",method=RequestMethod.GET) 限制前端的请求,意思是前端只能发送GET请求
//假如是@RequestMapping("/test",method=RequestMethod.POST) 意思是前端只能发送POST请求
//要加上@RequestBody 才能json自动转对象
@RequestMapping("/test")
public String testUser(@RequestBody User user) {
return "user";
}
@RequestMapping("/demo")
public String demoUser(){
//假如是@RequestMapping("/test",method=RequestMethod.POST) 意思是前端只能发送POST请求
//要加上@RequestBody 才能json自动转对象
@RequestMapping("/test")
public String testUser(@RequestBody User user) {
return "user";
}
@RequestMapping("/demo")
public String demoUser(){
//返回userspringmvc自动帮你加好了前后缀 就是我们要去的user.jsp 在viewResolver哪里已经配置好了路径的前后缀
return "demo";
}
@RequestMapping("/upload")
public String upload(MultipartFile file,HttpServletRequest request) throws IOException {
//拿到file的名称
String name=file.getOriginalFilename();
//拿到文件之后 存放在服务器(我的本地磁盘)的根目录下面
File uploadF=new File("C:\\Users\\邓伟权\\IdeaProjects\\"+name);
//倘若是多文件上传,则设置demo.jsp里的form表单多个input的file标签 然后设MultipartFile为数组 再用for循环取出
public String upload(MultipartFile file,HttpServletRequest request) throws IOException {
//拿到file的名称
String name=file.getOriginalFilename();
//拿到文件之后 存放在服务器(我的本地磁盘)的根目录下面
File uploadF=new File("C:\\Users\\邓伟权\\IdeaProjects\\"+name);
//倘若是多文件上传,则设置demo.jsp里的form表单多个input的file标签 然后设MultipartFile为数组 再用for循环取出
file.transferTo(uploadF);
return "demo";
}
return "demo";
}
//文件下载 返回的是个二进制流
@RequestMapping("/download")
public ResponseEntity<byte[]> download() throws IOException {
//要下载的文件所在服务器(我的本地磁盘)路径
String path="D:/123.jpg";
File file=new File(path);
//通过控制HTTP头(涉及到HTTP协议)来下载
HttpHeaders headers=new HttpHeaders();
headers.setContentDispositionFormData("attachment",path);
headers.setContentType(MediaType.IMAGE_JPEG);
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);
}
@RequestMapping("/download")
public ResponseEntity<byte[]> download() throws IOException {
//要下载的文件所在服务器(我的本地磁盘)路径
String path="D:/123.jpg";
File file=new File(path);
//通过控制HTTP头(涉及到HTTP协议)来下载
HttpHeaders headers=new HttpHeaders();
headers.setContentDispositionFormData("attachment",path);
headers.setContentType(MediaType.IMAGE_JPEG);
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);
}
}
修改demo.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
这里是demo.jsp
<%--这里form表单里的input标签里的name 一定要是file 因为Controller里的upload方法里的MultipartFile的参数是file--%>
<form method="post" action="/user/upload" enctype="multipart/form-data">
<input type="text" name="id"/>
<input type="file" name="file"/>
<input type="submit" value="提交"/>
</form>
<input type="submit" value="提交"/>
</form>
<a href="/user/download">点击我会下载图片呦!</a>
</body>
</html>
</body>
</html>
访问localhost:8080/user/download 点那个超链接 浏览器会提示下载了
至于下载的图片为啥无法显示 我也没找到问题 希望知道的朋友可以说下给我听- -...
至于下载的图片为啥无法显示 我也没找到问题 希望知道的朋友可以说下给我听- -...