我在一个web应用程序中使用Apache Shiro。登录和身份验证检查工作得很好,但我在实现注销/重新登录机制时遇到了问题:注销是在servlet中完成的:
private void logout(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
log.debug("do logout");
Subject subject = SecurityUtils.getSubject();
subject.logout();
resp.sendRedirect("end.html");
}但在注销并重新登录后,我得到以下错误:
org.apache.shiro.session.InvalidSessionException: java.lang.IllegalStateException:
getAttribute: Session already invalidated
at org.apache.shiro.web.session.HttpServletSession.removeAttribute(HttpServletSession.java:167)
at org.apache.shiro.session.ProxiedSession.removeAttribute(ProxiedSession.java:135)
at org.apache.shiro.subject.support.DelegatingSubject.clearRunAsIdentities(DelegatingSubject.java:424)
at org.apache.shiro.subject.support.DelegatingSubject.login(DelegatingSubject.java:246)登录通过以下方式完成(在UI组件的方法中,我使用ZK作为UI框架):
private void tryLogin(UsernamePasswordToken token) {
Subject subject = SecurityUtils.getSubject();
try {
subject.login(token);
...我不理解异常,因为从shiro注销会使会话无效,重新登录应该会访问新的会话。
发布于 2012-01-18 03:14:23
在Shiro 1.2之前的版本中,如果有人(或其他东西)在调用Subject.logout()之前使会话无效(例如,httpSession.invalidate(),然后是subject.logout()),就会发生这种情况。
这在SHIRO-298中被认为是一个错误,并且已经在1.2.0-SNAPSHOT构建中解决了。您可以使用当前的快照构建之一,也可以在Shiro 1.2.0发布时使用它。
发布于 2012-01-17 23:27:10
看起来您的UI框架在注销后没有重新生成会话。您可以尝试在登录调用之前强制新的会话调用subject.getSession()。如下所示:
private void tryLogin(UsernamePasswordToken token) {
Subject subject = SecurityUtils.getSubject();
Session session = subject.getSession();
try {
subject.login(token);https://stackoverflow.com/questions/8882153
复制相似问题