cindy源码阅读(9)SessionFilter

SessionFilter用于一些实际的操作后。
[img]http://dl.iteye.com/upload/attachment/0084/2887/d9b661d2-b3f2-30be-bb2d-f2bf7a1866ea.png[/img]

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调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值