关于SpringMVC拦截器和异常
一.文件上传
1.文件上传
- SpringMVC为文件上传提供了直接的支持,这种类型是通过即插即用的MultipartResolver技术的。Spring用Jakarta Commons FileUpload技术实现了一个MultipartResolver实现类:CommonsMultipartResolver.
- SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况下不能处理文件的上传工作,如果想使用Spring的文件上传功能,需现在上下文中配置MultipartResolver。
2. 配置MultipartResolver
- defaultEncoding:必须和用户JSP的pageEncoing属性一致,以便正确解析表单的内容。
- 为了让CommonsMulitpartResolver正确工作,必须先将Jakarta Commons FileUpload及Jakarta Commons io的类包添加到类路径下。
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<propert name="defaultEncoding" value="UTF-8"></property>
<property name="maxUploadSize" value="524880"></property>
</bean>
二.拦截器
1.自定义拦截器
SpringMVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerInterceptor接口。接口中有三个方法:
preHandle():这个方法在业务处理器请求之前被调用,在该方法中对用户请求request进行处理。如果你决定该拦截器对请求进行拦截处理好还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回false。
postHandle():这个方法在业务处理器处理完请求后,但是DispatcherServlet向客户端返回响应前被调用,在该方法中对用户请求request()进行处理。
afterCompletion():这个方法在DispatcherServlet完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。
2.拦截器方法执行顺序

3.配置自定义拦截器
<mvc:interceptors>
<!-- 拦截所有资源 -->
<bean class="com.desperado.interceptors.FirstInterceptor"></bean>
<!--拦截指定资源-->
<mvc:interceptor>
<mvc:mapping path="/emps"/>
<bean class="com.desperado.interceptors.SecondInterceptor"></bean>
</mvc:interceptor>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean>
</mvc:interceptors>
4.多个拦截器的执行顺序

5.拦截器preHandle()方法返回false时候的执行顺序

6.一道经典面试题
拦截器和过滤器有什么区别:
- 拦截器是基于java的反射机制的,而过滤器是基于函数回调的。
- 拦截器不依赖于Servlet容器,而过滤器依赖与Servlet容器。
- 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求其作用。
- 拦截器可以访问action的上下文、值栈里面的对象,而过滤器不能访问。
- 在action的声明周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次、(这里的调用一次,是对于构造函数而言的,而doFilter会对匹配的请求做持续的处理。)
- 拦截器可以获取IOC容器中的Bean,而过滤器不行。
执行顺序

三.异常处理
1.异常处理
- Spring MVC通过HandlerExceptionResolver处理程序的异常,包括Handler映射、数据绑定以及目标方法执行时发生的异常。
- SpringMVC提供的HandlerExceptionResolver的实现类
- AbstractHandlerExceptionResolver
- AbstractHandlerMethodExceptionResolver
- ExceptionHandlerExceptionResolver
- AnnotationMethodHandlerExceptionResolver
- DefaultHandlerExceptionResolver
- ResponseStatusExceptionResolver
- SimpleMappingExceptionResolver
- HandlerExceptionResolverComposite
2.HandlerExceptionResolver
- DispatcherServlet默认装配的HandlerExceptionResolver:
没有使用<mvc:annotation-driver />
-AnnotationMethodHandlerExceptionResolver
-DefaultHandlerExceptionResolver
-ResponseStatusExceptionResolver使用了<mvc:annotation-driver />
-ExceptionHandlerExceptionResolver
-DefaultHandlerExceptionResolver
-ResponseStatusExceptionResolver
3.ExceptionHandlerExceptionResolver
- 主要处理Handler中用@ExceptionHandler注解定义的方法。
- @ExceptionHandler注解定义的优先级问题:如果发生的是NullPointerException,但是声明的异常有RuntimeException和Exception,此时会根据异常的最近继承关系找到继承深度最浅的那个@ExceptionHandler注解方法,即标记了RuntimException的方法。
- ExceptionHandlerMethodResolver内部若找不到@ExceptionHandler注解的话,会找@ControllerAdvice中的@ExceptionHandler注解方法
4.ResponseStatusExceptionResolver
- 在异常及异常父类中找到@ResponseStatus注解,然后使用这个注解的属性进行处理。
- 定义一个@ResponseStatus注解修饰的异常类。
@ResponseStatus(HttpStatus.UNAUTHORIZED)
public class UnAuthorizedException extends RuntimeException{}
- 若在处理器方法中抛出了上面定义的异常:
由于触发的异常带有@ResponseStatus注解,因此会被ResponseStatusExceptionResolver解析到。最后响应HttpStatus.UNAUTHORIZED代码给客户端。
5.DefaultHandlerExceptionResolver
对一些特殊的异常进行处理,比如:
NoSuchRequestHandlingMethodException
HttpRequestMethodNotSupportedException
HttpMediaTypeNotSupportedException
HttpMediaTypeNotAcceptableException
等。
6.SimpleMappingExceptionResolver
如果希望对所有异常进行统一处理,可以使用该解析器,它将异常类名映射为视图名,即发生异常是使用对应的视图报告异常
四.Spring的运行流程
- 请求到达Spring DispatcherServlet的url-pattern。
- 判断SpringMVC中是否存在对应的映射
- 如果不存在判断是否配置了<mvc:default-servlet-handler />
- 如果配置了就去找目标资源,如果没有配置,返回404页面。
- 如果存在则从HandlerMapping获取handlerExecutionChain对象。
- 获取HandlerAdapter对象。
- 调用拦截器的preHandle方法。
- 调用目标Handler的目标方法得到ModelAndView对象。
- 调用拦截器的postHandle方法。
- 判断是否存在异常
- 存在异常,由HandlerExceptionResolver组件处理异常得到新的ModelAndView对象。
- 不存在异常,由ViewResolver组件根据ModelAndView对象得到实际的View
- 渲染视图
- 调用拦截器的afterCompletion方法。

五.在Spring的环境下使用SpringMVC
1.Bean被创建两次?
Spring的IOC容器不应该扫描SpringMVC中的Bean,对应的SpringMVC的IOC容器不应该扫描Spring中的Bean。
2.在SpringMVC配置文件中引用业务层的Bean
- 多个SpringIOC容器之间可以设置为父子关系,以实现良好的解耦。
- SpringMVC WEB层容器可作为"业务层"Spring容器的子容器,即WEB层容器可以引用业务层容器的Bean,而业务层容器却访问不到WEB层容器的Bean。

六、Spring和Struts2对比
- SpringMVC的入口是Servlet,而Struts2是Filter.
- SpringMVC会比Struts2快点,SpringMVC是基于方法设计的,而Struts2是基于类,每次发一个请求都会实实例一个Action
- SpringMVC使用更加简洁,开发效率高。
- Struts2的OGNL表达式使页面开发效率相比SpringMVC要高一点。
关于SpringMVC拦截器和异常的更多相关文章
- SpringMVC拦截器(实现登录验证拦截器)
本例实现登陆时的验证拦截,采用SpringMVC拦截器来实现 当用户点击到网站主页时要进行拦截,用户登录了才能进入网站主页,否则进入登陆页面 核心代码 首先是index.jsp,显示链接 <%@ ...
- Java Servlet 过滤器与 springmvc 拦截器的区别?
前言:在工作中,遇到需要记录日志的情况,不知道该选择过滤器还是拦截器,故总结了一下. servlet 过滤器 定义 java过滤器能够对目标资源的请求和响应进行截取.过滤器的工作方式分为四种 应用场景 ...
- SpringMVC之八:基于SpringMVC拦截器和注解实现controller中访问权限控制
SpringMVC的拦截器HandlerInterceptorAdapter对应提供了三个preHandle,postHandle,afterCompletion方法. preHandle在业务处理器 ...
- SpringMVC拦截器实现用户登录拦截
本例实现登陆时的验证拦截,采用SpringMVC拦截器来实现 当用户点击到网站主页时要进行拦截,用户登录了才能进入网站主页,否则进入登陆页面 核心代码 首先是index.jsp,显示链接 1 < ...
- springboot+springmvc拦截器做登录拦截
springboot+springmvc拦截器做登录拦截 LoginInterceptor 实现 HandlerInterceptor 接口,自定义拦截器处理方法 LoginConfiguration ...
- SpringMVC拦截器+Spring自定义注解实现权限验证
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- SpringMVC拦截器的使用
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...
- SpringMVC拦截器详解[附带源码分析]
目录 前言 重要接口及类介绍 源码分析 拦截器的配置 编写自定义的拦截器 总结 总结 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:h ...
- SpringMVC拦截器2(资源和权限管理)(作为补充说明)
SpringMVC拦截器(资源和权限管理) 1.DispatcherServlet SpringMVC具有统一的入口DispatcherServlet,所有的请求都通过DispatcherServle ...
随机推荐
- 20190710记录:去掉中转图,直接以1280*1024进行反坐标计算,填补pbFinal。
1.记录:去掉中转图,直接以1280*1024进行反坐标计算.pbFinal=1280*1024. // Imagejoint.cpp : 定义控制台应用程序的入口点. // #include &qu ...
- 《maven实战》笔记(2)----一个简单maven项目的搭建,测试和打包
参照<maven实战>在本地创建对应的基本项目helloworld,在本地完成后项目结构如下: 可以看到maven项目的骨架:src/main/java(javaz主代码)src/test ...
- create-react-app 工程,如何修改react端口号?
概要: 3000端口是webpack配置里面写的,可以通过传递一个PORT全局变量,来修改这个端口.当然,您还可以在node_modules/react-scripts/目录下面,批量搜索替换3000 ...
- ubuntu 切换默认python版本
现在的python项目都是基于python3的了,再用ubuntu的时候默认的版本是py2的,所以想切换到py3上: 打开终端: sudo update-alternatives --install ...
- 一百三十三:CMS系统之版块管理一
把模型创建到公共的models里面 class BoardModel(db.Model): __tablename__ = 'board' id = db.Column(db.Integer, pri ...
- VMware安装Centos7超详细过程
本篇文章主要介绍了VMware安装Centos7超详细过程(图文),具有一定的参考价值,感兴趣的小伙伴们可以参考一下 一.软硬件准备 软件:推荐使用VMwear,我用的是VMwear 12 镜像:Ce ...
- CDH集群部署hive建表中文乱码
背景:部署CDH集群的 hive 服务,选用 mysql 作为 hive 元数据的存储数据库,通过 hive cli 建表时发现中文注释均乱码. 现象:hive端建表中文注释乱码. 定位: 已经确认过 ...
- 【leetcode】507. Perfect Number
problem 507. Perfect Number solution: /* class Solution { public: bool checkPerfectNumber(int num) { ...
- FTP与SFTP的区别
简介 wikipedia - FTP --- FTP File Transfer wikipedia - SFTP --- SSH File Transfer 对比 缩写 名称 协议与端口 安全策略 ...
- Install Virtualbox on CentOS7---(後話,最終還是沒有用virtualbox做VM server ,感覺只適用于桌面)
參考: https://wiki.centos.org/zh-tw/HowTos/Virtualization/VirtualBox cd /etc/yum.repos.d wget http://d ...