springMVC-9-异常处理器和拦截器

异常解析器:

  • 用于统一处理 servlet 中的异常;

拦截器:

  • 用于统一处理业务中需要统一处理的页面(比如登录判断等), 可抽取出来统一处理.

我们一般需要在每个页面都通过在session中寻找有无loginID来判断这个用户是否登录,如果没有找到就需要写一个逻辑重定向到login界面,如果每个控制器都这样来一下,代码就会重复,这个时候我们就可以用拦截器针对特定的url控制器进行判断是否要重定向

先修改一下界面

index.jsp

<button class="btn btn-primary"><a href="/attend">interceptor</a></button>

control

//该控制器注册了拦截器,此时session上没有loginID(很显然没有)就不会到attend界面,而是到login界面
@RequestMapping(value = "/attend")
public String getAttend(){

    return "attend";
}

//这是没有登录信息之后拦截器响应过来的login界面请求
@RequestMapping(value = "/login")
public String getLogin(){
    return "login";
}

添加两个界面

使用拦截器

创建拦截器 MyInterceptor.java:(实现 HandlerInterceptor 接口并重写其三个方法)

//创建拦截器 MyInterceptor.java:(实现 HandlerInterceptor 接口并重写其三个方法)
public class MyInterceptor implements HandlerInterceptor {
    //在control之前执行,在这里写control中重复的功能
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession();
        if (session.getAttribute("loginID")!=null){
            System.out.println("loginID有值");
            //return true即放行,执行后来的control
            return true;
        }
        //中断之前响应请求,为没有登录转向一个定好的界面
        System.out.println("login无值");
        response.sendRedirect("/login");
        return false;
    }

    //在control之后,响应之前执行,一般不会使用
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("control到请求响应时间段");
    }

    //在视图渲染完毕之后执行,做一些资源的回收操作,一般不会使用
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }
}

注册拦截器(在springmvc配置文件)

<!--全部拦截器-->
<mvc:interceptors>
    <!--添加一个拦截器-->
    <mvc:interceptor>
        <!--需要拦截的路径-->
        <mvc:mapping path="/attend"/>
        <!--使用哪个拦截器-->
        <bean class="com.wang.converter.MyInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

拦截器的优先顺序

拦截器1

//拦截器1
 
public class Inteceptor1 implements HandlerInterceptor{
 
    //方法执行前1
     public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
        //返回值boolean类型  决定是否放行
        System.out.println("方法执行前1");
        return true;
    }
 
    //方法执行后1
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)throws Exception {
        System.out.println("方法执行后1");
    }
 
    //页面渲染后1
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception {
        System.out.println("页面渲染后1");   
    }
 
}

拦截器2

//拦截器1
 
public class Inteceptor1 implements HandlerInterceptor{
 
    //方法执行前1
     public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
        //返回值boolean类型  决定是否放行
        System.out.println("方法执行前1");
        return true;
    }
 
    //方法执行后1
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)throws Exception {
        System.out.println("方法执行后1");
    }
 
    //页面渲染后1
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception {
        System.out.println("页面渲染后1");   
    }
 
}

拦截器的配置(注意顺序)

//拦截器1
 
public class Inteceptor1 implements HandlerInterceptor{
 
    //方法执行前1
     public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
        //返回值boolean类型  决定是否放行
        System.out.println("方法执行前1");
        return true;
    }
 
    //方法执行后1
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)throws Exception {
        System.out.println("方法执行后1");
    }
 
    //页面渲染后1
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception {
        System.out.println("页面渲染后1");   
    }
 
}

结果:

posted @ 2021-06-07 16:17  Coder-Wang  阅读(61)  评论(0编辑  收藏  举报