springMvc-08 拦截器和异常处理


1、拦截器

拦截器是基于Java反射机制一级面向切面AOP技术的实现。

在SpringMvc中定义拦截器非常简单

第一种:通过实现HandlerInterceptor接口

第二种:继承HandlerInterceptor

1.1、代码例子

例子:检测用户是否登录

package rui.tool;

import org.springframework.lang.Nullable;
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 checkLogin implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler) throws Exception{
        System.out.println("First pre");
        HttpSession session = request.getSession();

        boolean isCheckLogin=true;
        //判断用户登录
        if(isCheckLogin) {
            Object isLogin = session.getAttribute("isLogin");
            if (isLogin == null) {
                response.sendRedirect("/user/login");
                return false;
            }
        }
        return  true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           @Nullable ModelAndView modelAndView) throws Exception {
        System.out.println("post pre");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
                                @Nullable Exception ex) throws Exception {
        System.out.println("after pre");
    }
}

1.2、配置springMvc.xml

    
    
        
        
        
            
            
            
            
            
            
            
        
    

这里的path和exclude-path可以配置多个。

可以配置多个拦截器,多个的执行顺序类似套娃。

First-Pre,Second-Pre,Handle,SecondPost,FirstPost,render,SecondAfter,firstAfter.

2、异常处理

在程序开发过程中,不同层的代码都有可能产生异常,如何对未处理的异常进行统一处理,SpringMvc提供了3种处理异常的方式

1)简单异常处理器

SimpleMappingExceptionResolver,需要在SpringMvc配置文件中进行如下的配置:

    
    
        
        
        
            
                
                /error-sql
                
                /error-io
            
        
    

2)实现异常处理接口

定义异常处理类

package rui.tool;

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

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

@Component
public class ExceptionHandle implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
                                         Object o, Exception e) {
        Map model = new HashMap();
        /*保存异常*/
        model.put("exception",e);
        //根据异常类型,返回给不同的显示页面,并携带异常对象
        if(e instanceof SQLException)
            return new ModelAndView("/error-sql",model);
        else if(e instanceof IOException)
            return new ModelAndView("/error-io",model);
        else
            return new ModelAndView("/error",model);
    }
}

springMvc中注入

    
    

3)通过注解使用

这种方式无需在SpringMvc中进行注入

定义控制器基类,并增加注解

package rui.tool;
import org.springframework.web.bind.annotation.ExceptionHandler;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;

public class baseController {
    @ExceptionHandler
    public  String exception(HttpServletRequest request, HttpServletResponse response,Exception ex)
    {
        request.setAttribute("exception",ex);
        //根据异常类型,返回给不同的显示页面,并携带异常对象
        if(ex instanceof SQLException)
            return "/error-sql";
        else if(ex instanceof IOException)
            return "/error-io";
        else
            return "/error";
    }
}

让其它控制器继承该baseController即可。

4)异常信息展示页面

<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>


    错误显示页面


异常错误

<%= exception %>

错误信息

<% exception.printStackTrace(response.getWriter()); %>

相关