public void process(finalPacket packet,
final XMPPResourceConnection session,
final NonAuthUserRepository repo,
final Queue<Packet> results,
final Map<String, Object> settings)
throwsXMPPException {
// 出于性能的考虑,最好在打印日志之前现检查一下日志级别
if(log.isLoggable(Level.FINEST)) {
log.finest("Processing packet: "+ packet.toString());
}
// 如果用户不在线,你也许想跳过后面的处理环节
if(session ==null) {
return;
}// end of if (session == null)
// 当插件在第一次处理这个用户的会话信息的时候,还有另外一种方法可以执行必要的操作
if(session.getSessionData(ID) ==null) {
session.putSessionData(ID, ID);
// 你可以把你的代码放到这里
.....
// 如果你不希望终止操作,那么就把return语句去掉
return;
}
// 如果用户的会话没有授权,那么每一次调用session.getUserId()方法都会抛出异常
try{
// 在比较JID之前一定记得要去掉resource部分
// JID的组成:jid = [ node "@" ] domain [ "/" resource ]
// 比如:chutianxing@gmail.com/home
String id = JIDUtils.getNodeID(packet.getElemTo());
// 检查一下这个packet是否是发给会话的拥有者
if(session.getUserId().equals(id)) {
// 如果是,那么这个消息的确是要发送给这个客户端的
Element elem = packet.getElement().clone();
Packet result =newPacket(elem);
// 这里就是我们为最终收到消息的用户设置客户端组件地址的地方了
// 在大多数情况,这可能是一个能够保持于客户端连接的c2s或Bosh组件
result.setTo(session.getConnectionId(packet.getElemTo()));
// 在大多数情况,这一步可以跳过,但是当packet的投递过程出现了什么问题,这么做可以为调用者返回一个错误
result.setFrom(packet.getTo());
// 最后不要忘记把结果packet放到结果队列里面去,否则结果会丢失
results.offer(result);
}// end of else
// 在比较JID之前一定记得要去掉resource部分
id = JIDUtils.getNodeID(packet.getElemFrom());
// 检查一下这个packet是否由会话的拥有者发出
if(session.getUserId().equals(id)) {
// 这是一个由客户端发出的packet,最简单的处理就是把packet转发到packet的目的地地址:
// 简单的对XML元素进行克隆,然后……
Element result = packet.getElement().clone();
// 把他放到传出packet队列里面就行了
results.offer(newPacket(result));
return;
}
// 程序真的会运行到这里吗?
// 是的,一些packet即没有from也没有to地址。最容易理解的一个例子是向服务器发送的获取某些数据的IQ请求。这类packet没有任何地址,并且需要对它做很多复杂的处理
// 下面的代码展示了如何确定这个seesion就是请求发起者的session
id = packet.getFrom();
// 下面的处理和检查getElementFrom差不多
if(session.getConnectionId().equals(id)) {
// 这里需要针对IQ packet做一些特别处理,但是我们需要处理的是message,所以这里只需要对它进行转发
Element result = packet.getElement().clone();
// 如果程序运行到这里说明packet的from地址是没有的,现在对from属性就行设置
result.setAttribute("from", session.getJID());
// 最后把传出packet放到结果队列里面就ok乐
results.offer(newPacket(result));
}
}catch(NotAuthorizedException e) {
log.warning("NotAuthorizedException for packet: " +
packet.getStringData());
results.offer(Authorization.NOT_AUTHORIZED.getResponseMessage(packet,
"You must authorize session first.",true));
}// end of try-catch
}
|
|