cindy源码阅读(9)SessionFilter

SessionFilter用于一些实际的操作后。
cindy源码阅读(9)SessionFilter_第1张图片

SessionFilter是通过SessionFilterChain调用的,SessionFilterChain不断的next,让每一个filter都起作用。
各个filter的优先级别是怎么样的呢:
protected SessionFilter nextFilter() {
            SessionFilter filter = null;
            if (dispatchFilter != null) {
                filter = dispatchFilter;
                dispatchFilter = null;
            } else if ((reversed && --cursor >= 0)
                    || (!reversed && ++cursor < appFilters.length)) {
                filter = appFilters[cursor];
            } else if (operateFilter != null) {
                filter = operateFilter;
                operateFilter = null;
            } else if (decodeFilter != null) {
                filter = decodeFilter;
                decodeFilter = null;
            } else {
                filter = handlerFilter;
                handlerFilter = null;
            }
            return filter;
        }


 private final SessionFilter[] appFilters = filters;
        private int cursor = -1;

        private SessionFilter dispatchFilter = DISPATCH_FILTER;
        private SessionFilter operateFilter;
        private SessionFilter decodeFilter = packetDecoderFilter;
        private SessionFilter handlerFilter = SESSION_HANDLER_FILTER;

大部分都是写死了的。
operateFilter必须通过构造方法传进去,一般很少用这个。
我们能扩展的是appFilters 。session的addSessionFilter其实改变的就是这个appFilters 。所以用的时候直接用addSessionFilter就好了。
 public synchronized void addSessionFilter(int index, SessionFilter filter) {
        if (filter != null) {
            index = Math.max(0, Math.min(filters.length, index));
            SessionFilter[] newFilters = new SessionFilter[filters.length + 1];
            System.arraycopy(filters, 0, newFilters, 0, index);
            System.arraycopy(filters, index, newFilters, index + 1,
                    filters.length - index);
            newFilters[index] = filter;
            filters = newFilters;
        }
    }


还有个经常扩展的地方是:session.setSessionHandler。SessionHandler是怎么起作用的呢。handlerFilter,而且这里的handlerFilter是写死了的,
   private static final SessionHandlerFilter SESSION_HANDLER_FILTER = new SessionHandlerFilter();

private SessionFilter handlerFilter = SESSION_HANDLER_FILTER;

这个SessionHandlerFilter 会去调用SessionHandler。

所以对于session的扩展其实都是通过filter来起作用的。而且扩展的地方也就是
session.addSessionFilter();
                session.setSessionHandler();


session设置解码的话,
session.setPacketDecoder
是通过
private SessionFilter decodeFilter = packetDecoderFilter;
是在read()的时候,触发filterchain的packetReceived方法,然后调用decodeFilter 解码。

session设置编码的话,是在send方法中直接编码的,没有通过filter。
   public Future send(Object obj, int priority) {
        Packet packet = null;
        try {
            packet = encoder.encode(this, obj);
        } catch (Exception e) {
            dispatchException(e);
            return new DefaultFuture(this, false);
        }
        return send(obj, packet, priority);
    }



可以看到SessionFilter和SessionHandler这两个接口的方法是一样的,可见他们的关系很密切,其实就是SessionHandler被SessionFilter调用。

你可能感兴趣的:(session)