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调用。