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(三)

基于MMSkeleton工具包中的ST-GCN模型实现一种基于动态拓扑图的人体骨架动作识别算法python源码+使用说明.zip 改进ST-GCN模型的骨架拓扑图构建部分,使用持续学习思想动态构建人体骨架拓扑图. 将具有多关系特性的人体骨架序列数据重新编码为关系三元组, 并基于长短期记忆网络, 通过解耦合的方式学习特征嵌入. 当处理新骨架关系三元组时, 使用部分更新机制 动态构建人体骨架拓扑图, 将拓扑图送入ST-GCN进行动作识别。 运行MMSKeleton工具包参考[GETTING_STARTED.md](./doc/GETTING_STARTED.md) - 单独使用ST-GCN模型进行人体动作识别参考[START_RECOGNITION.md](./doc/START_RECOGNITION.md) - 训练基于动态拓扑图的人体骨架动作识别算法 ``` shell cd DTG-SHR python ./mmskeleton/fewrel/test_lifelong_model.py ``` - 测试基于动态拓扑图的人体骨架动作识别算法 ``` shell cd DTG-SHR python ./mmskeleton/fewrel/train_lifelong_model.py ``` - 可视化算法运行结果 基于web server搭建前端 [[参考]](https://blog.csdn.net/gzq0723/article/details/113488110) 1、前端模块:包含 'static与'templates'文件夹为界面展示相关的代码。 templates里面包含了两个html的结构文档,用来定义浏览器的显示界面。 static里面的css和img用来修饰界面。 2、服务模块: servel.py里面是web服务的一个业务逻辑。 运行算法性能可视化web服务 ``` shell cd DTG-SHR python ./server.py ``` 【备注】 1、该资源内项目代码百分百可运行,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值