声明,使用JDK8、maven3.5.4、idea2018.2、spring5.0.7
springmvc中的拦截器,用于拦截前端发起的请求;
当请求到达DispatcherServlet前端控制器,DispatcherServlet根据请求路径到HandlerMapping查询具体的Handler,从HandlerMapping返回的值是一个HandlerExecutionChain执行链,
执行链包含一个具体的Handler对象和Interceptors(拦截器集合、存在的话就包括)。
一、自定义拦截器MyInterceptor
步骤:
1、自定义一个拦截器实现interceptor接口;
2、把MyInterceptor添加到springmvc,在 springmvc-servlet.xml配置文件中配置自定义的拦截器,使其生效;
子模块目录结构:
自定义的拦截器MyInterceptor :
/**
* @auther SyntacticSugar
* @data 2018/11/16 0016下午 12:22
*/
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("prehandle....");
return true; //返回true 、放行;false时候直接afterCompletion
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("posthandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("aftercompletion");
}
}
添加MyInterceptor 到springmvc中;
/* 表示拦截单级资源路径,比如/hello
/** 表示拦截多个资源路径 ,比如 /hello/test1
/ 表示根目录下所有的资源 ,即该项目下所有的请求级别路径
访问url进行测试:http://localhost:8080/users
<!-- 配置拦截器、可以配置多个 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.baidu.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
测试结果、自定义的interceptor生效:
由 < mvc:interceptors> 可以看出,拦截器可以配置多个,同时,handler 返回的执行链 HandlerExecutionChain 中也可能包含多个interceptors;
可以配置多个interceptor、执行顺序如下;
/
->interceptor1—>interceptor2—>interceptor3---->interceptorN---->Controller处理业务
->Controller返回结果---->postHandleN—>postHandle3–postHandle2–>postHandle1
->postHandle1---->View视图处理器渲染---->把渲染结果返回
afterCompletionN–>afterCompletion3—>afterCompletion2—>afterCompletion1
当拦截器prehandle方法返回值false时候,interceptor不放行,直接返回afterCompletion:
拦截器和过滤器的区别:
两者的本质区别:拦截器(Interceptor)是基于Java的反射机制,而过滤器(Filter)是基于函数回调。
从灵活性上说拦截器功能更强大些,Filter能做的事情,都能做,而且可以在请求前,请求后执行,比较灵活。Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验
、扫描二维码关注公众号,回复: 4107681 查看本文章(1)、Filter需要在web.xml中配置,依赖于Servlet;
(2)、Interceptor需要在SpringMVC中配置,依赖于框架;
(3)、Filter的执行顺序在Interceptor之前;
参考博文 https://blog.csdn.net/zxd1435513775/article/details/80556034
上传文件:
上传文件的表单,提交方式一定要是POST;表单类型一定要是multipart/form-data,表示可以上传文件等二进制数据。
1、引入依赖、springmvc-servlet.xml中配置文件上传解析器;
2、写controller
3、使用postman进行测试、或者使用Advanced REST client:
依赖:
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
配置springmvc-servlet文件:
<!--配置文件 上传解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 配置默认编码、上传的大小 -->
<property name="defaultEncoding" value="utf-8"/>
<property name="maxUploadSize" value="10485760"/>
</bean>
定义上传文件的参数为file类型;
@RequestParam注解,定义请求参数;
package com.baidu.controller;
/**
* @auther SyntacticSugar
* @data 2018/11/16 0016上午 11:55
*/
@Controller
public class UploadController {
@RequestMapping("upload")
public String upload(@RequestParam("file")MultipartFile file){
if (file!=null) {
try {
file.transferTo(new File("D:/upload/"+file.getOriginalFilename()));
} catch (Exception e) {
e.printStackTrace();
}
}
// 上传成功转发至 success.html 页面
return "redirect:success.html";
}
}
发送post请求:
status:200 OK ,请求成功: