关于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);
}

												

最新文章

  1. 认真理解 图片 &lt;img&gt; background-image
  2. 369. Plus One Linked List
  3. UITextView限制字数与行数
  4. 九度 1420 Jobdu MM分水果 -- 动态规划、深度优先搜索
  5. ElasticSearch Search API 简介
  6. 【asp.net爬虫】asp.NET分页控件抓取第n页数据 javascript:__doPostBack
  7. Mac下Sublime快捷键
  8. 在WebView中如何让JS与Java安全地互相调用
  9. dubbo服务者配置说明
  10. arcconf
  11. MyBatis新手教程(一)
  12. python print输出带颜色 总结
  13. codestyle 设置问题
  14. SQL 必知必会&#183;笔记&lt;6&gt;使用数据处理函数
  15. 后端返回值以json的格式返回,前端以json格式接收
  16. Codeforces 1000F One Occurrence 主席树|| 离线+线段树
  17. English trip V1 - 12.Belongings 行李 Teacher:Jade Key: ?
  18. MongoDB 数据查询
  19. Android Activity与Fragment生命周期
  20. GitHub vs GitLab:它们有什么区别?

热门文章

  1. winform删除dataGridView列报异常:System.IndexOutOfRangeException:“索引 7 没有值
  2. C#NULL条件运算符
  3. Android插件基础之类加载器学习
  4. Docker运行dotnetcore
  5. 阿里云ECS服务器部署HADOOP集群(六):Flume 安装
  6. Dockerfile优化
  7. centos7.6 安装Tomcat-8.5.39
  8. 微信 PC HOOK
  9. 网页前端之JavaScript学习记录总结篇
  10. Java之Calendar类