博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
拦截器
阅读量:5936 次
发布时间:2019-06-19

本文共 1546 字,大约阅读时间需要 5 分钟。

hot3.png

1.实现判断用户是否已登录的拦截器(利用springmvc的拦截器HandlerInterceptorAdapter)

一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的,这种方式可以实现Bean预处理、后处理。 

Spring MVC的拦截器不仅可实现Filter的所有功能,还可以更精确的控制拦截精度。 
Spring为我们提供了org.springframework.web.servlet.handler.HandlerInterceptorAdapter这个适配器,继承此类,可以非常方便的实现自己的拦截器。他有三个方法:

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)     

        throws Exception {     
        return true;    

    }     

    public void postHandle(     
            HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)     
            throws Exception {     
    }     
    public void afterCompletion(     
            HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)     
            throws Exception {     
    } 
分别实现预处理、后处理(调用了Service并返回ModelAndView,但未进行页面渲染)、返回处理(已经渲染了页面)

 发起请求,进入拦截器链,运行所有拦截器的preHandle方法,

1.当preHandle方法返回false时,从当前拦截器往回执行所有拦截器的afterCompletion方法,再退出拦截器链。
2.当preHandle方法全为true时,执行下一个拦截器,直到所有拦截器执行完。再运行被拦截的Controller。然后进入拦截器链,运行所有拦截器的postHandle方法,完后从最后一个拦截器往回执行所有拦截器的afterCompletion方法.
当有拦截器抛出异常时,会从当前拦截器往回执行所有拦截器的afterCompletion方法

preHandle方法:返回true,映射处理器执行链将继续执行;当返回false时,DispatcherServlet处理器认为拦截器已经处理完了请求,而不继续执行执行链中的其它拦截器和处理器。它的API文档解释如下:true if the execution chain should proceed with the next interceptor or the handler itself. Else, DispatcherServlet assumes that this interceptor has already dealt with the response itself.

在preHandle中,可以进行编码、安全控制等处理; 
在postHandle中,有机会修改ModelAndView; 
在afterCompletion中,可以根据ex是否为null判断是否发生了异常,进行日志记录。

110504_QueF_3676955.png

springmvc的配置文件:

110539_0EQR_3676955.png

mapping path如果写成"/**"或者不写就表示对所有controller都进行拦截,

转载于:https://my.oschina.net/u/3676955/blog/1618926

你可能感兴趣的文章
VC++文件操作大全
查看>>
队列的顺序存储---顺序队列
查看>>
NOIP
查看>>
MicroPython-GPS教程之TPYBoardv702控制5110显示当前经纬度
查看>>
ListView简单使用
查看>>
用HTML/JS/PHP方式实现页面延时跳转
查看>>
【Redis】安装PHP的redis驱动(二)
查看>>
java中string和int互相转化
查看>>
什么是序列化,为什么要序列化
查看>>
Java保留小数点后有效数字
查看>>
CommonHelper
查看>>
excel操作for(lutai)
查看>>
Codeforces Round #162 (Div. 2) C. Escape from Stones
查看>>
2017 Multi-University Training Contest - Team 4 phone call(树+lca+并查集)
查看>>
Struts2文件下载
查看>>
error LNK2019: 无法解析的外部符号 _PhInitializePhLib,该符号在函数 _EnumHandle 中被引用...
查看>>
lodash篇之对象深度比较_.isEqual
查看>>
python之鸭子类型
查看>>
新学期的合作
查看>>
[Cloudera Hadoop] CDH 4.0 Quick Start Guide (动手实践,最新版CDH4.0,企业版Hadoop)
查看>>