Spring MVC 拦截器

Spring MVC拦截器:
HandlerInterceptor,HandlerInterceptorAdapter

二者差别不是太大,HandlerInterceptorAdapter是一个抽象类,里面有对HandlerInterceptor空实现,方便调用者有选择的实现相应的方法。

此拦截器能做到比filter更小粒度的拦截,能否在Spring MVC Controller执行前,执行后,View渲染完之后dosomething。

HandlerInterceptor

boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
        throws Exception;

此方法在Controller执行前被调用:可以进行编码、安全控制等处理。

void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView);

此方法在Controller执行后被调用:有机会修改ModelAndView。

void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);

此方法在View被渲染结束后被调用:可以根据ex是否为null判断是否发生了异常,进行日志记录。

HandlerInterceptorAdapter

包含HandlerInterceptor接口里的三个方法的空实现
同时还有HandlerInterceptor接口的空实现方法:
afterConcurrentHandlingStarted(),用于Controller中执行异步方法后调用(目前没有发现是这种用途

public void afterConcurrentHandlingStarted(
            HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
    }

Demo

HomePageHandlerInterceptorAdapter.java

public class HomePageHandlerInterceptorAdapter extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("==============HomePageHandlerInterceptorAdapter.preHandle");
        return true;
    }

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

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

    @Override
    public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("==============HomePageHandlerInterceptorAdapter.afterConcurrentHandlingStarted");
    }
}

HomePageHandlerInteceptor.java

public class HomePageHandlerInteceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        System.out.println("==============HomePageHandlerInteceptor.preHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("==============HomePageHandlerInteceptor.postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        System.out.println("==============HomePageHandlerInteceptor.afterCompletion");
    }
}

WebMvcConfig.java

@Configuration
@EnableWebMvc
@ComponentScan("study.book.springinaction")
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
    public void addInterceptors(InterceptorRegistry registry) {
        HomePageHandlerInteceptor homePageHandlerInteceptor = new HomePageHandlerInteceptor();
        HomePageHandlerInterceptorAdapter homePageHandlerInterceptorAdapter = new HomePageHandlerInterceptorAdapter();
        registry.addInterceptor(homePageHandlerInteceptor).addPathPatterns("/home");
        registry.addInterceptor(homePageHandlerInterceptorAdapter).addPathPatterns("/home");
    }

    ...其他代码...
}

home.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>
<%@ page isELIgnored="false" %>
<% System.out.println("=======>home.jsp loaded");%>

HomeController.java

......

@RequestMapping(value = "/home", method = RequestMethod.GET)
    public String homePage(Model model){
        model.addAttribute("homekey","主页");
        System.out.println(Thread.currentThread().getName()+"=========>  access home page");
        model.addAttribute("index", index++);
        Runnable run = new Runnable() {
            @Override
            public void run() {
                try {
                    TimeUnit.SECONDS.sleep(3);
                    System.out.println(Thread.currentThread().getName()+"========>thread executed<===========");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        ExecutorService service = Executors.newFixedThreadPool(3);
        service.execute(run);
        service.shutdown();
        return "home";
    }

......

控制台显示

==============HomePageHandlerInteceptor.preHandle
==============HomePageHandlerInterceptorAdapter.preHandle
http-nio-8085-exec-1=========>  access home page
==============HomePageHandlerInterceptorAdapter.postHandle
==============HomePageHandlerInteceptor.postHandle
=======>home.jsp loaded
==============HomePageHandlerInterceptorAdapter.afterCompletion
==============HomePageHandlerInteceptor.afterCompletion
pool-1-thread-1========>thread executed<===========
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值