简而言之,我正在进行双向SSL,客户端证书用于识别我的最终用户。 SSLHandler做得很好,SSLHandler知道关于该主体的所有信息。如何与其他处理程序共享该信息,以便他们可以在整个渠道管道中完成工作?
这是我的SSLHandler扩展程序找到用户主体的位置......
...
类MySslHandler扩展了SSLHandler {....
public void messageReceived(
ChannelHandlerContext ctx, MessageEvent e) throws Exception{
logger.info("messageReceived");
super.messageReceived(ctx, e);
try{
System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! " + getPrincipalCertificate().getSubjectDN().toString());
}
catch(Throwable t){
logger.error("Unable to see principal ", t);
}
}
/**
*
* @return Return the user certificate of the principal
* @throws SSLPeerUnverifiedException if the peer is not yet verified
*/
public X509Certificate getPrincipalCertificate() throws SSLPeerUnverifiedException{
return getEngine().getSession().getPeerCertificateChain()[0];
}
}
我可能应该向ChannelHandlerContext添加信息,以便它可以在SSL会话期间和我所有其他处理程序中使用,但我无法弄清楚如何做到这一点。这是错误的方法吗?有什么建议吗?
谢谢!
答案 0 :(得分:1)
如果您需要在ChannelHandler之间共享它,则需要使用静态ChannelLocal实例。因为ChannelHandlerContext是每个ChannelHandler所必需的。
请参阅http://netty.io/docs/stable/api/org/jboss/netty/channel/ChannelLocal.html