SpringSecurity的源码解析

SpringSecurity是spring家族中的一份子,关于使用方式我们不多说,我们看下其执行源码路径如何,介绍依赖于注解的配置。

因为我们的项目中采用了Spring5的Reactor响应式框架,它底层是基于netty的网络编程。

所以程序入口是在NioEventLoop的run方法中:如下:

try {
                        processSelectedKeys();
                    }

通过processSelectedKeys查找程序中有没有可读或者可写的请求。后面会进入NioEventLoop的processSelectedKey(SelectionKey k, AbstractNioChannel ch)方法中,查看是否与可读或者可写,然后执行相应操作,如下:

if ((readyOps & SelectionKey.OP_WRITE) != 0) {
                // Call forceFlush which will also take care of clear the OP_WRITE once there is nothing left to write
                ch.unsafe().forceFlush();
            }

            // Also check for readOps of 0 to workaround possible JDK bug which may otherwise lead
            // to a spin loop
            if ((readyOps & (SelectionKey.OP_READ | SelectionKey.OP_ACCEPT)) != 0 || readyOps == 0) {
                unsafe.read();
            }

因为我们一个请求过来是读请求,所以进入unsafe.read()方法,去通道中去读取信息,然后进入了HttpServerHandler类的channelRead方法中.

然后调用ChannnelOptions类的applyHandler方法,映射Request,Response进行业务处理,如下:

	protected final void applyHandler() {
//		channel.pipeline()
//		       .fireUserEventTriggered(NettyPipeline.handlerStartedEvent());
		if (log.isDebugEnabled()) {
			log.debug("[{}] {} handler is being applied: {}", formatName(), channel
					(), handler);
		}
		Mono.fromDirect(handler.apply((INBOUND) this, (OUTBOUND) this))
		       .subscribe(this);
	}

看到这段代码很多人会很疑惑,this是HttpServerOptions,这个类强转成了INBOUND和OUTBOUND两种类型,这是为什么,我们来看下HttpServerOptions类型的结构图:

可以看到HttpServerOperations类型实现了HttpServerResponse和HtteServerRequest两种类型。

接着向下看,因为选择的handler的类型为:HttpWebHandlerAdapter,后面会执行其handle()方法,在这个hande方法中继续深入,最后进入FilteringWebHandler的handle方法开始调用过滤器链如下:

	@Override
	public Mono<Void> handle(ServerWebExchange exchange) {
		return this.filters.length != 0 ?
				new DefaultWebFilterChain(getDelegate(), this.filters).filter(exchange) :
				super.handle(exchange);
	}

猜你喜欢

转载自blog.csdn.net/lz710117239/article/details/80614823