SessionFilter用于一些实际的操作后。
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调用。