SpringMVC拦截器 & 异常处理机制

拦截器 Interceptor

SpringMVC拦截器类似于Servlet开发中的过滤器Fliter, 用于对处理器的预处理和后处理。

开发步骤

  1. 创建拦截器类实现HandlerInterceptor接口

  2. 配置拦截器

  3. 测试拦截器拦截的作用效果

    复制代码
     <context:component-scan base-package="com.itheima.Controller"/>
    复制代码
     <mvc:annotation-driven/>
    复制代码
     <mvc:default-servlet-handler/>

    mvc:interceptors
    mvc:interceptor

    复制代码
         <mvc:mapping path="/**"/>
         <bean class="com.itheima.interceptor.MyInterceptor"/>
     </mvc:interceptor>

    </mvc:interceptors>

    mvc:interceptors
    mvc:interceptor

    复制代码
         <mvc:mapping path="/**"/>
         <bean class="com.itheima.interceptor.MyInterceptor2"/>
     </mvc:interceptor>

    </mvc:interceptors>

    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    public class MyInterceptor implements HandlerInterceptor {
    // 在目标方法执行之前执行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    System.out.println(" prehandle ");
    String param = request.getParameter("param");
    if("yes".equals(param)){
    return ture;
    }else{
    request.getRequestDispatcher("/error.jsp");
    return false;

    复制代码
         }

    //return ture放行 false不放行
    }

    // 在目标方法执行之后,视图返回之前进行执行
    @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. ");
    }
    }

对preHandle:即使不放行也可以通过response重定向或者request转发。

对postHandle:视图返回前可以通过modelandview把数据或者视图改成其他的

配置两个拦截器的结果

顺序和在applicationContext.xml文件中配置的顺序有关系

异常处理机制

异常处理的两种方式

• 使用SpringMVC提供的简单异常处理器SimpleExceptionResolver

• 实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器

简单异常处理器SimpleExceptionResolver

value就是视图的名称,例如,error.jsp。因为INTERNALRESOURCEVIEWRESOLVER中已经配好了prefix suffix(前后缀)。

exceptionMappings优先进行匹配,没有匹配的再去匹配默认错误视图。

自定义异常处理的步骤

  1. 创建异常处理器实现类 实现 HandlerExceptionResolver接口

  2. 配置异常处理器

  3. 编写异常页面

  4. 测试异常跳转

    复制代码
     <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    复制代码
         <property name="exceptionMappings">
             <map>
                 <entry key="ClassCastExcep tion" value="error1"/>
                 <entry key="ErrorDefineByMe" value="error2"/>
             </map>
         </property>
     </bean>
    复制代码
     <bean class="com.itheima.Resolver.MyExceptionReslover"/>

    public class MyExceptionReslover implements HandlerExceptionResolver
    {
    public ModelAndView resolverException(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod)
    {
    ModelAndView mv = new ModelAndView();
    if (e instanceof MyException){
    mv.addObject("info","自定义异常");
    }else if(e instanceof ClassCastException){
    mv.addObject("info","类转换异常");
    }
    }

    复制代码
     @Override
     public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
         return null;
     }

    }

最后这段代码仅供参考

异常处理的核心还是解耦合,最初使用的TRY catch方法会和业务代码出现耦合的情况,并且不同位置可能抛出相同的异常不容易查找;此外,如果相比较 出现错误 服务器报500错误,显示好看的出错页面用户体验更好。

相关推荐
小白男神2 天前
MySQL进阶学习四(存储过程、游标、触发器)
mysql
这个DBA有点耶2 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G2 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备2 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远2 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
kybs19912 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
2601_962218612 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法
程序猿_极客2 天前
【免费】分享一套优质的基于SSM的校园失物招领系统的设计与实现,源码+文档+视频详解(讲解)
java·mysql·ssm·课程设计·失物招领系统
张洛闻Eren2 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
于平安2 天前
MySQL-触发器
数据库·mysql