第四章 拦截器和异常处理

回顾

课前测:

本章内容

拦截器

异常处理

第一节:拦截器

javaWeb: 三大组件为servlet、filter 、listener

filter: 1.filter接口 2.实现这个接口的过滤器

应用:字符编码过滤,登录过滤,敏感字符过滤,日志记录

listener:监听器

1. SpringMVC拦截器的简介

​ Spring MVC中的拦截器(Interceptor),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志判断用户是否登录等。要使用Spring MVC中的拦截器,就需要对拦截器类进行定义和配置。

Filter过滤器:

Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是设置字符集、控制权限、控制转向、做一些业务逻辑判断等。其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应(Request、Response)统一设置编码,简化操作;同时还可进行逻辑判断,如用户是否已经登陆、有没有权限访问该页面等等工作。它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁。

Filter可以认为是Servlet的一种“加强版”,它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。Filter也可以对用户请求生成响应,这一点与Servlet相同,但实际上很少会使用Filter向用户请求生成响应。使用Filter完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。

Filter有如下几个用处

  • 在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。

  • 根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。

  • 在HttpServletResponse到达客户端之前,拦截HttpServletResponse。

  • 根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。

    Filter有如下几个种类。

  • 用户授权的Filter:Filter负责检查用户请求,根据请求过滤用户非法请求。

  • 日志Filter:详细记录某些特殊的用户请求。

  • 负责解码的Filter:包括对非标准编码的请求解码。

  • 能改变XML内容的XSLT Filter等。

  • Filter可以负责拦截多个请求或响应;一个请求或响应也可以被多个Filter拦截。

Interceptor拦截器:

​ 拦截器只会拦截jsp之外的请求。.html

​ 三层架构:表现成(jsp+Controller),持久层(pojo + dao),业务层(service==>在项目中的体现 在加一个包 service);

​ 拦截器是在面向切面编程中应用的(AOP),就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法。是基于JAVA的反射机制。拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截,然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。

SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的。在SpringMVC 中定义一个Interceptor 非常简单,主要有两种方式,

​ 第一种方式是要定义的Interceptor类要实现了Spring 的HandlerInterceptor 接口,或者是这个类继承实现了HandlerInterceptor 接口的类,比如Spring 已经提供的实现了HandlerInterceptor 接口的抽象类HandlerInterceptorAdapter ;

​ 第二种方式是实现Spring的WebRequestInterceptor接口,或者是继承实现了WebRequestInterceptor的类。

2. 实现方式

springMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的。

实现了Spring 的HandlerInterceptor 接口或者继承实现了HandlerInterceptor 接口的(比如抽象类HandlerInterceptorAdapter )。

HandlerInterceptor 接口简介

HandlerMapping

HandlerAdapter

HanderItercepter

HandlerInterceptor 接口中定义了三个方法,我们就是通过这三个方法来对用户的请求进行拦截处理的。

(1)preHandle (HttpServletRequest request, HttpServletResponse response, Object handle) :该方法将在请求处理之前进行调用。SpringMVC 中的Interceptor 是链式的调用的,每个Interceptor 的调用会依据它的声明顺序依次执行,而且最先执行的都是Interceptor 中的preHandle 方法。该方法的返回值是布尔值Boolean类型的,当它返回为false 时,表示请求结束,后续的Interceptor 和Controller 都不会再执行;当返回值为true 时就会继续调用下一个。

(2)postHandle (HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView) 方法:是在当前请求进行处理之后,也就是Controller 方法调用之后执行,但是它会在DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。postHandle 方法被调用的方向跟preHandle 是相反的,也就是说先声明的Interceptor 的postHandle 方法反而会后执行

(3)afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex) 方法:将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的

实现步骤:
  • 配置文件配置

    <!--配置拦截器--><mvc:interceptors><!--拦截器1--><mvc:interceptor><mvc:mapping path="/要拦截的请求路径"/><mvc:exclude-mapping path="/放行路径"></mvc:exclude-mapping><bean class="自定义拦截器的全限定名"></bean></mvc:interceptor><!--拦截器2--><mvc:interceptor><mvc:mapping path="/要拦截的请求路径"/><mvc:exclude-mapping path="/放行路径"></mvc:exclude-mapping><bean class="自定义拦截器的全限定名"></bean></mvc:interceptor></mvc:interceptors>
    
  • 自定义拦截器类实现HandlerInterceptor 接口

  • 根据自己的需求详细的实现preHandle方法

3.拦截器执行链

请求----》拦截器1 prehandle方法----》拦截器2的prehandle方法—》拦截器3的prehandle方法----》执行当前请求的controller中的方法----》拦截器3的posthandle方法----》拦截器2的posthandle方法----》拦截器1 posthandle方法—>

执行拦截器3afterCompletion方法–>执行拦截器2的afterCompletion方法–>执行拦截器1的afterCompletion方法–》结束!

4.拦截器登录拦截案例

------>见课堂代码 interceptor_exception项目。

第二节:统一异常处理

目的:就是让客户在使用程序期间,如果出现错误了,会有一个友好的页面显示,不会再出现大堆的 异常错误信息。

异常:程序运行期间,或者程序编码期间可能出现的错误。

异常的继承体系

​ throwable : 异常的顶级父类

​ Error:错误

​ Exception: 异常

​ RuntimeException:

​ 空指针,类转换,数组下标越界,算术。。。

​ 非运行时:编译期异常

​ IO异常,格式化异常。。。sql异常

异常的处理:

​ 抛出异常:

​ throws 方法的尾部追加异常种类,s复数,肯定是方法后.

​ 代码中: throw new 异常种类(msg);

​ 捕获异常:

​ try{ 可能出现异常的代码} catch (异常的种类){打印异常信息} finally{一定会执行的代码}。

自定以异常:

​ 要求:所有的异常都要处于异常的继承体系之下。

​ 说明我们自己的异常要继承已经存在的jdk内部的异常。一般继承 Exception。

1.统一异常处理思路分析:


2.自定义异常类

package com.qy136.exception;
/*** 自定义异常类要处于异常的继承体系之下*/
public class ErrorException extends Exception{public ErrorException(){super();}public ErrorException(String message){super(message);}
}

改造Controller:

@RequestMapping("getUser")public String getUser() throws Exception{try {int a = 1/0;} catch (Exception e) {e.printStackTrace();throw  new Exception("出错了,请联系管理员!1111");}return "success";}

在第一步和第二步完毕之后,大家可以做个测试,这个测试是测试我们500的错误,500错误已经变成自己的Execption信息。

3.自定义异常处理器

在SpringMVC里面,叫HandlerExceptionResolver

package com.qy136.exception;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*** 自定义异常处理器* 必须要实现这个接口* HandlerExceptionResolver*/
public class ErrorExceptionResolver implements HandlerExceptionResolver {/**     * @param httpServletRequest* @param httpServletResponse* @param o* @param  e 此参数 表示的就是异常处理器捕获到的异常。* @return*/@Overridepublic ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {/*因为,此方法接收到的异常直接就是Exception父类异常,直接使用父类异常无法取出我们自己抛出的子类异常信息所以需要做一个强转,将这个Exception 类型的e 转换成我们自己抛出的ErrorException异常*/ErrorException exception;//判断e是否是ErrorException子类异常,或者同类异常if(e instanceof ErrorException){exception = (ErrorException) e;}else{exception = new ErrorException("出错了,请联系管理员!2222");}//通过此ModelAndView对象,让客户端显示一个友好的错误页面ModelAndView mv = new ModelAndView();mv.setViewName("error");mv.addObject("msg",exception.getMessage());return mv;}
}

4.配置异常处理器

<!--配置异常处理器-->
<bean id="唯一标识" class="自定义异常处理器的全限定名"></bean>

不这样是否可以???之前看到一些自定义的bean,都可以使用Spring注解托管,我们这里用的是

在第三步类前面加了个@Component。

5.观察结果显示

调试二

注意:原来出现异常之后,在页面上用户会看到一堆堆的500、404的错误信息,用户体验不好。我们可以自定义错误页面信息,UI体验效果会更好。

在登录页面,加异常处理.

异常处理器的全限定名">


不这样是否可以???之前看到一些自定义的bean,都可以使用Spring注解托管,我们这里用的是在第三步类前面加了个@Component。#### 5.观察结果显示**调试二**注意:原来出现异常之后,在页面上用户会看到一堆堆的500、404的错误信息,用户体验不好。我们可以自定义错误页面信息,UI体验效果会更好。在登录页面,加异常处理.

SpringMVC之拦截器和异常处理相关推荐

  1. SpringMVC——自定义拦截器、异常处理以及父子容器配置

    SpringMVC--自定义拦截器.异常处理以及父子容器配置 参考文章: (1)SpringMVC--自定义拦截器.异常处理以及父子容器配置 (2)https://www.cnblogs.com/so ...

  2. SpringMVC自定义拦截器与异常处理(自定义异常)

    SpringMVC自定义拦截器与异常处理 拦截器概念 拦截器代码演示 创建maven工程 pom.xml <?xml version="1.0" encoding=" ...

  3. SpringMVC 之拦截器和异常处理

    1. 文件上传 Spring 使用 Jakarta Commons FileUpload 技术实现了一个 MultipartResolver 实现类: CommonsMultipartResolver ...

  4. SpringMVC拦截器与异常处理

    SpringMVC拦截器与异常处理 参考文章: (1)SpringMVC拦截器与异常处理 (2)https://www.cnblogs.com/luckgood/p/9724057.html 备忘一下 ...

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

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

  6. springmvc高级(拦截器,全局异常处理,文件上传)

    SpringMVC 1.文件上传 文件上传: 指的就是将用户本地计算机中文件上传到服务器上的过程称之为文件上传 1).文件上传编程步骤 # 1.项目中引入相关依赖 <dependency> ...

  7. SpringMVC经典系列-14自己定义SpringMVC的拦截器---【LinusZhu】

    注意:此文章是个人原创.希望有转载须要的朋友们标明文章出处.假设各位朋友们认为写的还好,就给个赞哈.你的鼓舞是我创作的最大动力,LinusZhu在此表示十分感谢,当然文章中如有纰漏,请联系linusz ...

  8. SpringMVC应用拦截器判断用户是否登录

    拦截器定义 实现HandlerInterceptor接口,实现接口方法. import javax.servlet.http.HttpServletRequest; import javax.serv ...

  9. Struts2拦截器实现异常处理机制

    http://bbs.itcast.cn/thread-10364-1-1.html Struts2拦截器实现异常处理机制   在j2ee项目中,系统内部难免会出现一些异常,如果把异常放任不管直接打印 ...

最新文章

  1. kvm_guest主机克隆
  2. 今天下午2:00,RT-Thread与智能车竞赛概况
  3. python解决实际问题的代码_Python代码规范问题及解决
  4. 习题7-2 求一批整数中出现最多的个位数字 (20分)
  5. FileNotFoundError: [Errno 2] No such file or directory: 'traingingDigits/0_0.txt'
  6. eclipse快捷键Alt + /
  7. Arcgis api for javascript学习笔记(3.2X版本)-初步尝试
  8. .NET Standard中使用TCPListener和TCPClient的高性能TCP客户端服务器
  9. mongodb pv uv ip 统计
  10. 一个请求里能有多个cookie吗_从一个男人对女人家人的态度里,能看出他有多爱对方吗?...
  11. The content of element type “mapper“ must match “(cache-ref|cache|resultMap*|parameterMap*|sql*|inse
  12. 服务器win10系统开机慢,Win10系统更新后开机变得很慢的解决方法
  13. 商标注册过程中,如何避免字体侵权?
  14. JavaScript CSS jQuery 网页音乐播放器
  15. 发款php蜘蛛统计插件只要有mysql就可用
  16. 《信息安全保障》一1.3 信息系统安全保障概念与模型
  17. 1392:繁忙的都市(city)
  18. c语言怎么使用数组播放下一首音乐,【数组编程面试题】面试问题:c语言MP3播… - 看准网...
  19. 阿里云-Centos7安装Jenkins
  20. 武汉购物全攻略[转自PAIPAI社区-武汉版]

热门文章

  1. ACM练习 校赛183F:公平的游戏(TLE)【vector不重复添加、删除指定元素、排序】
  2. 使用IBM Blockchain Platform extension开发你的第一个fabric智能合约
  3. 容器源码分析之HashTable(八)
  4. C++ string 使用详解(含C++20新特性)
  5. SYN攻击原理 accpet()函数调用时机
  6. HTML Parser 源代码
  7. Promise第三篇:async和await关键字
  8. 怎么点亮段码屏_我的投影机怎么不亮了
  9. 电脑复制粘贴_手机扫一扫,现实物体隔空复制粘贴进电脑!北大校友的AI新研究,现在变成AR酷炫应用...
  10. 史上最全的Linux常用——目录和文件管理命令——收藏这一篇就够了!(超全,超详细)