SpringMVC-异常解析器和拦截器

一.异常解析器,统一处理

Controller中的每个Handler不再自己处理异常,而是直接throws所有异常。

package com.cos.qf.common;

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

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


/**
 * @author: qiuyongqi
 * @time: 15:01 2021/5/22
 * @description: 异常解析器:主体逻辑
 * 	             执行时刻:当handler中抛出异常时,会执行:捕获异常,并可以跳到错误页面
 */
public class ExceptionRes implements HandlerExceptionResolver {
    
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        //创建一个ModelAndView
        ModelAndView modelAndView = new ModelAndView();
        System.out.println("异常解析器运行,处理全局问题");
        //识别异常
        if (e instanceof NullPointerException) {
            modelAndView.setViewName("redirect:/error.jsp");
        }else if (e instanceof NumberFormatException){
            modelAndView.setViewName("redirect:/error.jsp");
        }else {
            modelAndView.setViewName("redirect:/error.jsp");
        }
        return modelAndView;
    }
}
<!-- 声明异常解析器 -->	
<bean class="com.baizhi.exception.resolver.MyExResolver"></bean>

二.拦截器

1.定义拦截器

执行顺序: preHandle--postHandle--afterCompletion

package com.cos.qf.web.interceptor;

import com.cos.qf.entity.Emp;
import com.cos.qf.servlet.impl.EmpServicesImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

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

public class MyInterceptor implements HandlerInterceptor {

    @Autowired
    private EmpServicesImpl empServices;

    /**
     * @author: qiuyongqi
     * @time: 11:12 2021/5/20
     * @description: 进入执行xcontroller方法之前的拦截方法
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("执行controller之前");
        HttpSession session = request.getSession();
        Emp login = (Emp) session.getAttribute("login");
        System.out.println(login);
        if (login!=null) {
            empServices.sayHi();
            return true;//放行,后续的拦截器或handler就会执行
        }
        response.sendRedirect("/error.jsp");
        return false;//中断请求
    }

    /**
     * @author: qiuyongqi
     * @time: 11:12 2021/5/20
     * @description: 执行完controller方法给出响应之前执行的拦截
     */
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("执行controller方法后,的拦截");
    }

    /**
     * @author: qiuyongqi
     * @time: 11:13 2021/5/20
     * @description: 在view视图渲染数据结束后执行,资源回收
     */
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("已经给视图渲染玩数据,在响应给用户前,回收资源");
    }
}

2.配置拦截器

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/inter/test1"/>
        <mvc:mapping path="/inter/test2"/>
        <mvc:mapping path="/inter/test*"/> <!-- test开头 -->
        <mvc:mapping path="/inter/**"/> <!-- /** 任意多级任意路径 -->
        <mvc:exclude-mapping path="/inter/a/**"/>   <!--不拦截此路径-->
        <bean class="com.baizhi.interceptor.MyInter1"></bean>   <!--拦截器类-->
    </mvc:interceptor>
</mvc:interceptors>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值