栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【springMVC】SpringMVC的拦截器(Interceptor)和异常处理【附源码】

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【springMVC】SpringMVC的拦截器(Interceptor)和异常处理【附源码】

一、拦截器

1.SpringMVC的拦截器(Interceptor)
类似于Servlet中的过滤器(Filter),主要用于拦截用户请求(控制器方法)并做出相应的处理。例如:权限验证、判断用户是否登录等。
2.拦截器的定义
(1)实现HandlerInterceptor接口;
(2)继承HandlerInterceptorAdapter类。
3.拦截器的三个抽象方法
(1)preHandle:控制器方法执行之前执行preHandle(),其boolean类型的返回值表示是否拦截或放行,返回true为放行,即调用控制器方法;返回false表示拦截,即不调用控制器方法
(2)postHandle:控制器方法执行之后执行postHandle()
(3)afterComplation:处理完视图和模型数据,渲染视图完毕之后执行afterComplation()
4.拦截器的执行顺序
(1)单个拦截器的执行顺序
程序首先会执行拦截器类中的preHandler()方法,如果该方法的返回值会true,则会继续向下执行处理器中的方法,否则将不会再向下执行;在业务处理器(控制器Controller类)处理完请求后,会执行postHandler()方法,然后会通过DispatcherServlet向客户端返回响应;在DispatcherServlet处理完请求后,才会执行afterCompletion()方法。

(2)多个拦截器的执行顺序:
① 若每个拦截器的preHandle()都返回true
多个拦截器同时工作时,它们的preHandle()方法会按照配置文件中拦截器的配置顺序执行,而它们的postHandle和afterCompletion()方法会按照配置顺序的反序执行。
② 若某个拦截器的preHandle()返回了false
preHandle()返回false和它之前的拦截器的preHandle()都会执行,postHandle()都不执行,返回false的拦截器之前的拦截器的afterComplation()会执行
5.自定义拦截器
pom.xml依赖


    
    
        org.springframework
        spring-webmvc
        5.3.1
    
    
    
        ch.qos.logback
        logback-classic
        1.2.3
    
    
    
        javax.servlet
        javax.servlet-api
        3.1.0
        provided
    
    
    
        org.thymeleaf
        thymeleaf-spring5
        3.0.12.RELEASE
    

(1)InterceptorController.java

@Controller
public class InterceptorController {
    @RequestMapping("/testInterceptor")
    public String testInterceptor(){
        return "success";
    }
}

(2)CustomerInterceptor.java

//若想配置多个拦截器,只需要复制该拦截器,改个类名就可
@Component
public class CustomerInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("InterceptorTest--->preHandle");
        //return false表示不拦截
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("InterceptorTest--->postHandle");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("InterceptorTest--->afterCompletion");
    }
}

(3)springMVC.xml




    
    
    
        
        
        
            
                
                    
                        
                        
                        
                        
                        
                        
                    
                
            
        
    
    
    
    
    
    
    
    

			



        
            
            
            
        
    

(4)index.html




    
    Title


首页


测试Interceptor

(5)web.xml



    
    
        CharacterEncodingFilter
        org.springframework.web.filter.CharacterEncodingFilter
        
        
            encoding
            UTF-8
        
        
        
            forceResponseEncoding
            true
        
    
    
    
        CharacterEncodingFilter
        /*
    

    
    
        HiddenHttpMethodFilter
        org.springframework.web.filter.HiddenHttpMethodFilter
    
    
        HiddenHttpMethodFilter
        /*
    
    
    
        DispatcherServlet
        org.springframework.web.servlet.DispatcherServlet
        
            contextConfigLocation
            classpath:springMVC.xml
        
        1
    
    
        DispatcherServlet
        /
    

将项目部署到tomcat服务器后运行,点击超链接

返回idea的控制台,就可以看到两个拦截器的执行顺序。

二、异常处理器

SpringMVC提供了一个处理控制器方法执行过程中所出现的异常接口:HandlerExceptionResolver
HandlerExceptionResolver接口的实现类有:DefaultHandlerExceptionResolver和
SimpleMappingExceptionResolver
SpringMVC提供了自定义的异常处理器SimpleMappingExceptionResolver,使用方式:

基于配置的异常处理

(1)在SpringMVC的配置文件中进行配置


    
        
            
            error
        
    
    
    

(2)index.html

测试Exception

(3)error.html




    
    Title


出现了错误!!!

(4)控制器方法

@RequestMapping("/testException")
public String testException(){
    int i = 10/0;
    return "error";
}

基于注解的异常处理

只需要创建一个java类,然后标注上相应的注解,即可免去了SpringMVC配置文件的配置。

@ControllerAdvice
public class ExceptionController {
    @ExceptionHandler(value = {ArithmeticException.class,NullPointerException.class})
    public String testException(Exception ex, Model model){
        model.addAttribute("ex",ex);
        return "error";
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/692818.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号