博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringMVC 拦截器实现分析
阅读量:4213 次
发布时间:2019-05-26

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

SpringMVC的拦截器不同于Spring的拦截器,SpringMVC具有统一的入口DispatcherServlet,所有的请求都通过DispatcherServlet,所以只需要在DispatcherServlet上做文章即可,DispatcherServlet也没有代理,同时SpringMVC管理的Controller也不有代理。哪不难想到我们在执行controller之前做某些动作,执行完毕做某些动作,render完成做某些动作。SpringMVC的拦截器对应提供了三个preHandle,postHandle,afterCompletion方法。只需在三个方法内写我们需要的逻辑就行,多了都是废话,还是代码实在

HandlerInterceptor[] interceptors = mappedHandler.getInterceptors();				if (interceptors != null) {					for (int i = 0; i < interceptors.length; i++) {						HandlerInterceptor interceptor = interceptors[i];//ha.handle是调用具体的controller在此之前执行preHandle						if (!interceptor.preHandle(processedRequest, response, mappedHandler.getHandler())) {							triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, null);							return;						}						interceptorIndex = i;					}				}				// Actually invoke the handler.				mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

  完成调用之后,调用render(),最后执行afterCompletion()

if (interceptors != null) {					for (int i = interceptors.length - 1; i >= 0; i--) {						HandlerInterceptor interceptor = interceptors[i];						interceptor.postHandle(processedRequest, response, mappedHandler.getHandler(), mv);					}				}			}			catch (ModelAndViewDefiningException ex) {				logger.debug("ModelAndViewDefiningException encountered", ex);				mv = ex.getModelAndView();			}			catch (Exception ex) {				Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);				mv = processHandlerException(processedRequest, response, handler, ex);				errorView = (mv != null);			}			// Did the handler return a view to render?			if (mv != null && !mv.wasCleared()) {				render(mv, processedRequest, response);				if (errorView) {					WebUtils.clearErrorRequestAttributes(request);				}			}			else {				if (logger.isDebugEnabled()) {					logger.debug("Null ModelAndView returned to DispatcherServlet with name '" + getServletName() +							"': assuming HandlerAdapter completed request handling");				}			}			// Trigger after-completion for successful outcome.			triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, null);

 

转载地址:http://smdmi.baihongyu.com/

你可能感兴趣的文章
3.0正式版环境搭建(4)-- 运行(3)创建的工程
查看>>
C++ 枚举声明 enum 和 enum class
查看>>
Python optionParser模块的使用方法
查看>>
android 消灭星星出错
查看>>
Android APK反编译详解(附图)
查看>>
pycharm 教程(二)设置字体大小
查看>>
PyCharm 教程(三)Hello world!
查看>>
PyCharm: 显示源码行号
查看>>
PyCharm 教程(四)显示行号
查看>>
PyCharm 教程(五)断点 调试
查看>>
win7 dos命令行查看环境变量
查看>>
python print输出中文
查看>>
Python 基础语法(1)
查看>>
Python 变量类型
查看>>
Python 运算符
查看>>
Python for 循环语句
查看>>
python中if __name__ == '__main__': 的解析
查看>>
CCSpriteFrameCache精灵帧缓存分析(3):CCSpriteFrame分析
查看>>
cocos2dx-2.X前后台切换分析,基于android平台
查看>>
cocos2dx使用第三方字库.ttf,需要注意的事项
查看>>