spring mvc 源码简要分析
2024-10-18 13:05:08
关于web项目,运用比较多的是过滤器和拦截器
过滤器基于责任链设计模式
创建过滤器链
/ Create the filter chain for this request
ApplicationFilterChain filterChain =
ApplicationFilterFactory.createFilterChain(request, wrapper, servlet); //调用
private void internalDoFilter(ServletRequest request,
ServletResponse response)
throws IOException, ServletException { // Call the next filter if there is one
if (pos < n) {
ApplicationFilterConfig filterConfig = filters[pos++];
try {
Filter filter = filterConfig.getFilter(); if (request.isAsyncSupported() && "false".equalsIgnoreCase(
filterConfig.getFilterDef().getAsyncSupported())) {
request.setAttribute(Globals.ASYNC_SUPPORTED_ATTR, Boolean.FALSE);
}
if( Globals.IS_SECURITY_ENABLED ) {
final ServletRequest req = request;
final ServletResponse res = response;
Principal principal =
((HttpServletRequest) req).getUserPrincipal(); Object[] args = new Object[]{req, res, this};
SecurityUtil.doAsPrivilege ("doFilter", filter, classType, args, principal);
} else {
filter.doFilter(request, response, this);
}
} catch (IOException | ServletException | RuntimeException e) {
throw e;
} catch (Throwable e) {
e = ExceptionUtils.unwrapInvocationTargetException(e);
ExceptionUtils.handleThrowable(e);
throw new ServletException(sm.getString("filterChain.filter"), e);
}
return;
} // We fell off the end of the chain -- call the servlet instance
try {
if (ApplicationDispatcher.WRAP_SAME_OBJECT) {
lastServicedRequest.set(request);
lastServicedResponse.set(response);
} if (request.isAsyncSupported() && !servletSupportsAsync) {
request.setAttribute(Globals.ASYNC_SUPPORTED_ATTR,
Boolean.FALSE);
}
// Use potentially wrapped request from this point
if ((request instanceof HttpServletRequest) &&
(response instanceof HttpServletResponse) &&
Globals.IS_SECURITY_ENABLED ) {
final ServletRequest req = request;
final ServletResponse res = response;
Principal principal =
((HttpServletRequest) req).getUserPrincipal();
Object[] args = new Object[]{req, res};
SecurityUtil.doAsPrivilege("service",
servlet,
classTypeUsedInService,
args,
principal);
} else {
servlet.service(request, response);
}
} catch (IOException | ServletException | RuntimeException e) {
throw e;
} catch (Throwable e) {
e = ExceptionUtils.unwrapInvocationTargetException(e);
ExceptionUtils.handleThrowable(e);
throw new ServletException(sm.getString("filterChain.servlet"), e);
} finally {
if (ApplicationDispatcher.WRAP_SAME_OBJECT) {
lastServicedRequest.set(null);
lastServicedResponse.set(null);
}
}
拦截器基于动态代理
// 执行拦截器的prehandle
if (!mappedHandler.applyPreHandle(processedRequest, response)) {
return;
}
// Actually invoke the handler.
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
// 执行拦截器的PostHandle
mappedHandler.applyPostHandle(processedRequest, response, mv);
// 执行拦截器的AfterCompletion
if (mappedHandler != null) {
mappedHandler.triggerAfterCompletion(request, response, null);
}
最新文章
- 认真理解 图片 <;img>; background-image
- 369. Plus One Linked List
- UITextView限制字数与行数
- 九度 1420 Jobdu MM分水果 -- 动态规划、深度优先搜索
- ElasticSearch Search API 简介
- 【asp.net爬虫】asp.NET分页控件抓取第n页数据 javascript:__doPostBack
- Mac下Sublime快捷键
- 在WebView中如何让JS与Java安全地互相调用
- dubbo服务者配置说明
- arcconf
- MyBatis新手教程(一)
- python print输出带颜色 总结
- codestyle 设置问题
- SQL 必知必会&#183;笔记<;6>;使用数据处理函数
- 后端返回值以json的格式返回,前端以json格式接收
- Codeforces 1000F One Occurrence 主席树|| 离线+线段树
- English trip V1 - 12.Belongings 行李 Teacher:Jade Key: ?
- MongoDB 数据查询
- Android Activity与Fragment生命周期
- GitHub vs GitLab:它们有什么区别?