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错误,显示好看的出错页面用户体验更好。

相关推荐
科技小登1 小时前
重大活动安全保障方案怎么选?重保服务、攻防演练、应急响应与安全意识培训实战与边界
数据库·人工智能·安全
番茄你个西红41 小时前
金仓KFS同步工具常见问题解决方法
数据库
CarIise1 小时前
JDBC数据库操作与SQL注入防范
数据库·sql
CCYe、1 小时前
新模型上线、旧模型下线:企业AI网关如何管住模型版本
java·网络·数据库·人工智能
疯狂打码的少年2 小时前
【数据库技术】SQL嵌套查询(IN/EXISTS/ANY/ALL)
数据库·笔记·sql
清晨0012 小时前
国产化数据库替代方案:openGauss 详解与 MySQL 平滑迁移实战
数据库·mysql
λqaq72 小时前
MongoDB数据库基础 :非关系型数据库入门与常用操作
数据库·学习·mongodb·nosql
词却2 小时前
数据库基础:TCL事务与DDL视图
数据库
码农小麦2 小时前
LangChain 1.3.18 + DeepSeek-v4-flash 工具调用踩坑实录
网络·数据库·langchain