-3,1处和2处,会将ZuulProperties中sensitiveHeaders的值加入到要过滤的字段里面,来看下ProxyRequestHelper的addIgnoredHeaders方法,如下List name.toLowerCase());//1 } for (String name : names) { set.add(name.toLowerCase());//2 } } List 调用isIncludedHeader方法,isIncludedHeader里面获取RequestContext,判断当前的这个header key是不是在IGNORED_HEADERS这个集合里面——List context.getZuulRequestHeaders()获取我们手动设置的header(调用addZuulResponseHeader方法设置),之后逐个遍历,如果在IGNORED_HEADERS这个集合里面——List 要注意的是,如果要往下游传的header含有大写的,那么下游接收到的header是小写的,原因在List-4中可以看出。 Reference 源码
Object target); void setProperties(Properties properties); } 来看PageInterceptor如何实现intercept接口的,如下List -4 List-4 @Override public Object intercept(Invocation invocation) throws Throwable { try { List-4中如果不需要分页,则直接调用executor的query方法。 List-4中,需要count查询后,判断手写的count已存在,不存在则调用mybatis的builder等工具类构造,之后进行count查询,得到结果后调用dialect的afterCount方法, else if(page.isOrderByOnly()){ page.setTotal(pageList.size()); } return page; } List
getHandlerInternal的实现在AbstractHandlerMethodMapping中,如List-3所示 获取request中的url 调用lookupHandlerMethod方法获取HandlerMethod,如List handlerMethod.createWithResolvedBean() : null); } finally { this.mappingRegistry.releaseReadLock(); } } List return handleNoMatch(this.mappingRegistry.getMappings().keySet(), lookupPath, request); } } 如List 回到List-3,在List-4中返回HandlerMethod后,调用getHandlerExecutionChain方法构造一个HandlerExecutionChain,读者可以去看下HandlerExecutionChain
; } else { return new LinkedList<T>(); } } defaultStrategies是DispatcherServlet的一个属性,它的初始化如下List -4所示, List-4 defaultStrategies的初始化源码 private static final Properties defaultStrategies; static { // 图3 文件DispatcherServlet.properties的内容 List-3中的createDefaultStrategy(context, clazz),代码如下List-4所示。 List-4 方法createDefaultStrategy的源码 protected Object createDefaultStrategy(ApplicationContext context,
afterPropertiesSet() { initHandlerMethods(); } 由List-3知道afterPropertiesSet调用了initHandlerMethods(),如下List List-4中的handlerMethodsInitialized是空方法,不用管。 List-4 protected void initHandlerMethods() { if (logger.isDebugEnabled()) { logger.debug("Looking detectHandlerMethods(beanName); } } } handlerMethodsInitialized(getHandlerMethods()); } 来看List
RequestInterceptor接口,之后交给Spring容器,feign会自动加上这个拦截器,这个的实现也在FeignClientFactoryBean中,在configureUsingConfiguration方法中,如下List -4 List-4 Map<String, RequestInterceptor> requestInterceptors = context .getInstances(this.contextId = null) { builder.requestInterceptors(requestInterceptors.values()); } List-4中的context.getInstances
mysql.service文件末尾加入如下List-3中的内容 List-3 LimitNOFILE=65535 LimitMEMLOCK=65535 3.编辑/etc/mysql/my.cnf,加入List -4中的内容 List-4 [mysqld] max_connections=600 4.执行命令 List-5 sudo systemctl daemon-reload 5.重启MySQL之后,查看
怎么在ingress中使用这个secret呢,如下List-4,在annotations中使用我们创建好的secret List-4 apiVersion: networking.k8s.io/v1beta1
HttpServletResponse的重定向 如果满足步骤1的要求,那么不会调用FilterChain了 来看下SecurityContextLogoutHandler的logout方法,如下List -4所示, List-4 public void logout(HttpServletRequest request, HttpServletResponse response, Authentication SecurityContextHolder.getContext(); context.setAuthentication(null); } SecurityContextHolder.clearContext(); } 在List
IgnoreExceptionHandler只是将异常打印下,但是FatalExceptionHandler则不同,正如其名字所示,它内部将异常再次封装到RuntimeException再次抛出,如下List -4 List-4 public final class FatalExceptionHandler implements ExceptionHandler<Object> { private
之后如List-4所示,没有报错就说明成功了。 List-4 .
3、index.vue 创建index.vue List-4 index.vue <template>
this.handler, mv); } } } 位置6、如果之前没有抛出异常,就调用processDispatchResult方法,方法processDispatchResult的最后,有如下List 由List-5可以看出,afterCompletion中抛出异常,会被Spring框架吞噬,每个HandlerInterceptor的afterCompletion方法中,拿到的异常都是null——看List List-4 ...... if (mappedHandler !
(Server)server.get() : null; } chooseRoundRobinAfterFiltering中是如何实现的呢,如下List-4, 获取所有的服务实例 遍历服务列表, 过滤掉不满足条件的 在满足条件的服务列表中,再进行RoundRibbon算法,选出服务 List-4 public Optional<Server> chooseRoundRobinAfterFiltering
else { return null; } } ReflectiveAspectJAdvisorFactory的getAdvice方法会根据方法上的注解,创建对应的Advice,如下List -4所示 List-4 public Advice getAdvice(Method candidateAdviceMethod, AspectJExpressionPointcut expressionPointcut
List-2 cd redis-3.2.10 sudo make test 4.执行install命令 编译安装,如下 List-3 sudo make install 5.查看结果 List 9 2 23:16 src/redis-server -rwxr-xr-x@ 1 mjduan wheel 59K 7 28 2017 src/redis-trib.rb 如List
HeaderContentNegotiationStrategy加入到结果集合中,即Http头部的Accept 如果设置了defaultNegotiationStrategy,就会把我们添加的自定义Strategy加入到结果集合中 如下List resolveMediaTypes返回的值不等于MEDIA_TYPE_ALL_LIST,那么就直接返回,结合List-3中添加的顺序,这就是路径拓展第一生效,第二format固定值,第三Http头部的Accept List
如下List-4所示,构造方法中注册了Adapter,而后getInterceptors方法中会使用模板模式将advisor中的advice转换为MethodInterceptor。 List-4 public class DefaultAdvisorAdapterRegistry implements AdvisorAdapterRegistry, Serializable {
doFilterInternal,通过getFilters(HttpServletRequest)方法,根据request的url来获取对应的Filter,如下List-3所示,SecurityFilterChain是个接口,如List filterChains) { if (chain.matches(request)) { return chain.getFilters(); } } return null; } List
若类上没有找到RequestMapping注解,则判断类上是否有Controller注解,如果有,那么执行detectHandlerMethods,这个方法的源码有点多,我只是给出部分,如下List-4 所示: List-4 DefaultAnnotationHandlerMapping的detectHandlerMethods方法源码 protected boolean detectHandlerMethods 从List-4可知,detectHandlerMethods方法,对类的方法进行遍历,之后逐个处理每个方法。