我正在尝试在Tomcat中创建自定义域。我的问题是,有一个SessionAttributeListener作为框架的一部分,它检查添加到会话的任何对象是否可序列化,如果不是,则会导致问题......如使会话无效。
因为org.apache.catalina.realm.GenericPrincipal不可序列化,所以我尝试编写自己的类来实现Principal和Serializable。这似乎很好,除非然后尝试使用
request.isUserInRole("user")
我得到 false ,以及用户应该拥有的任何其他角色。如果我在Valve类中为CustomPrincipal换掉GenericPrincipal,则返回true。所以我的问题是:
修改 为了清楚起见,我实际上已经实现了这一点,CustomPrincipal中的代码与GenericPrincipal完全相同,除了它还实现了Serializable。 request.isUserInRole(“user”)在我的Valve中有的时候返回false:
request.setUserPrincipal(new CustomPrincipal(args...));
但不是我做的时候
request.setUserPrincipal(new GenericPrincipal(args...));
当我使用该类时,对request.getUserPrincipal()的任何调用都将返回CustomPrincipal。
答案 0 :(得分:1)
您需要为我们提供更多背景信息。但请注意,Principal无论如何都是抽象的;例如,KerberosPrincipal实现了Principal和Serializable,因此有一些方法来实现它。
isUserInRole 做什么将请求包装到实现类中,以查看由Pricipal标识的用户是否确实在该角色中。所以我认为第一件事可能是调用getUserPrincipal并查看servlet 认为当前的Principal是什么。