SSM整合Shiro
记住登录功能
本文直接在基础版上进行修改,想了解基础版请点这里。SSM整合Shiro(一)
自定义一个过滤器,用来解决通过记住我功能登录时Session丢失问题
package com.demo.filter;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
import com.demo.model.LearnShiroUser;
/**
*
* 自定义过滤器(解决记住我功能Session丢失)<br>
* <br>
* -------------------------------------<br>
* 创建人员: ToBeNumberTwo<br>
* 创建时间: 2020年5月18日 下午7:54:31<br>
* -------------------------------------<br>
* 修改人员: ToBeNumberTwo<br>
* 修改时间: 2020年5月18日 下午7:54:31<br>
* -------------------------------------<br>
*/
public class ShiroMyRememberMeFilter extends FormAuthenticationFilter {
@Override
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
try {
Subject subject = SecurityUtils.getSubject();
Session session = subject.getSession();
if (!subject.isAuthenticated() && subject.isRemembered() && session.getAttribute("user") == null) {
Object principal = subject.getPrincipal();
if (principal != null && principal instanceof LearnShiroUser) {
LearnShiroUser loginUser = (LearnShiroUser) principal;
session.setAttribute("user", loginUser);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
}
修改application-shiro.xml
<!-- 新加的部分 start -->
<!-- 注入Cookie对象 -->
<bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
<!-- Cookie名 必须赋值且value固定 -->
<constructor-arg value="rememberMe"></constructor-arg>
<!-- 设置cookie有效时间单位:秒。 -->
<property name="maxAge" value="#{7*24*60*60}"></property>
<!-- 只有HTTP请求才保存cookie -->
<property name="httpOnly" value="true"></property>
</bean>
<!-- 注入Cookie管理器 -->
<bean id="rememberMeCookieManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">
<property name="cookie" ref="rememberMeCookie"></property>
</bean>
<!-- 注入自定义过滤器 -->
<bean id="shiroMyRememberMeFilter" class="com.demo.filter.ShiroMyRememberMeFilter"></bean>
<!-- 新加的部分 end -->
<!-- 修改的部分 start -->
<!-- 注入安全管理器 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="rememberMeManager" ref="rememberMeCookieManager"></property>
<property name="realm" ref="userIdRealm"></property>
</bean>
<!-- 配置shiro的过滤器链 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- 安全管理器 -->
<property name="securityManager" ref="securityManager" />
<!-- 未认证时跳转 -->
<property name="loginUrl" value="/login/init" />
<!-- 未授权时跳转 -->
<property name="unauthorizedUrl" value="/unauthorized.jsp" />
<!-- 将自定义过滤器添加进来 -->
<property name="filters">
<map>
<entry key="shiroMyRememberMeFilter" value-ref="shiroMyRememberMeFilter"></entry>
</map>
</property>
<!-- 配置放行规则 -->
<property name="filterChainDefinitions">
<value>
#不需要认证
/login/init/** = anon
/login/login/** = anon
/login/logout/** = anon
/resources/** = anon
#权限授权拦截
/home/superAdminByFilter = perms["superAdmin"]
#记住我功能
/** = shiroMyRememberMeFilter,user
#需要认证
/* = authc
/*/* = authc
</value>
</property>
</bean>
<!-- 修改的部分 end -->
修改LoginController.java
修改登录方法,当用户选择“七天免登陆”时,设置记住登录。
/**
* 登陆
*
* @param user
* @param rememberMe
* @param session
* @return
* @throws Exception
*/
@RequestMapping("login")
public String login(LearnShiroUser user, String rememberMe, HttpSession session) throws Exception {
UsernamePasswordToken token = new UsernamePasswordToken();
String account = "";
char[] password = new char[] {};
if (!StringUtils.isEmpty(user.getAccount())) {
account = user.getAccount();
}
if (!StringUtils.isEmpty(user.getUserPassword())) {
password = user.getUserPassword().toCharArray();
}
token.setUsername(account);
token.setPassword(password);
if ("1".equals(rememberMe)) {
token.setRememberMe(true);
}
Subject subject = SecurityUtils.getSubject();
try {
// 登陆认证
subject.login(token);
Object object = subject.getPrincipal();
if (object != null && object instanceof LearnShiroUser) {
LearnShiroUser loginUser = (LearnShiroUser) object;
session.setAttribute("user", loginUser);
}
return "redirect:../home/init";
} catch (UnknownAccountException uae) {
throw new UnknownAccountException("账户不存在!!!");
} catch (IncorrectCredentialsException ice) {
throw new IncorrectCredentialsException("密码不正确!!!");
} catch (LockedAccountException lae) {
throw new LockedAccountException("账户已锁定!!!");
}
}
修改login.jsp
添加记住登录复选框
<tr>
<td colspan="2">
<input type="checkbox" name="rememberMe" value="1">
<span>七天免登陆</span>
</td>
</tr>
效果
选择七天免登陆,进行登录
登录后再cookie中可以看到 rememberMe 这个Cookie。
关闭浏览器,再重新打开 http://localhost:8080/ShrioBySSM/home/init 链接,可以看到刚登录用户信息。
下一篇SSM整合Shiro(三)