前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >shiro教程9(session和remember me)

shiro教程9(session和remember me)

作者头像
用户4919348
发布2019-04-02 11:41:53
1.8K0
发布2019-04-02 11:41:53
举报
文章被收录于专栏:波波烤鸭波波烤鸭

session

  shiro提供的session不依赖web容器,可以直接使用,如果是在web环境下,session中的数据和httpsession中的数据是通的。Shiro中的session可以出现在任何地方,例如service、dao等,不需要从controller中传递session参数,用户保存在session中的数据可以在HTTP session中获取,保存在httpsession中的数据也可以从session中获取。

session常用方法

在这里插入图片描述
在这里插入图片描述

api

说明

startTimestamp

session的创建时间;

stopTimestamp

session的失效时间;

lastAccessTime

session的最近一次访问时间,初始值是startTimestamp

timeout

session的有效时长,默认30分钟

attributes

session的属性容器

touch

刷新

stop

销毁会话,Subject.logout()时会自动调用stop方法来销毁会

实现登录成功后保存登录信息到session中

创建FormAuthenticationFilter的子类重写onLoginSuccess方法

代码语言:javascript
复制
/**
 * 自定义的表单认证过滤器
 * @author dengp
 *
 */
public class CustomFormAuthenticationFilter extends FormAuthenticationFilter{
	/**
	 * 认证成功后会调用次方法
	 */
	@Override
	protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest request,
			ServletResponse response) throws Exception {
		// 获取登录信息
		String user = (String) subject.getPrincipal();
		System.out.println("登录账户:"+user);
		Session session = subject.getSession();
		session.setAttribute("msg", "自定义FormFilter传递的信息...");
		return super.onLoginSuccess(token, subject, request, response);
	}
}

配置文件中配置

代码语言:javascript
复制
<!-- 配置自定义的表单过滤器 -->
<bean id="customFormAuthenticationFilter" class="com.dpb.filter.CustomFormAuthenticationFilter">
		<!-- 可以修改表单接收的参数名称 -->
		<property name="usernameParam" value="username" />
		<property name="passwordParam" value="password" />
	</bean>

	<!-- 注册ShiroFilterFactoryBean 注意id必须和web.xml中注册的targetBeanName的值一致 -->
	<bean class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"
		id="shiro">
		<!-- 注册SecurityManager -->
		<property name="securityManager" ref="securityManager" />
		<!-- 登录地址 如果用户请求的的地址是 login.do 那么会对该地址认证 -->
		<property name="loginUrl" value="/login.do" />
		<!-- 登录成功的跳转地址 -->
		<property name="successUrl" value="/jsp/success.jsp" />
		<!-- 访问未授权的页面跳转的地址 -->
		<property name="unauthorizedUrl" value="/jsp/refuse.jsp" />

		<property name="filters">
			<map>
				<entry key="authc" value-ref="customFormAuthenticationFilter"/>
			</map>
		</property>
		<!-- 设置 过滤器链 -->
		<property name="filterChainDefinitions">
			<value>
				/login.do=authc
				/login.jsp=anon
				/logout=logout
				/**=authc
			</value>
		</property>
	</bean>
在这里插入图片描述
在这里插入图片描述

测试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

remember me

  Shiro提供了记住我(RememberMe)的功能,比如访问如淘宝等一些网站时,关闭了浏览器下次再打开时还是能记住你是谁,下次访问时无需再登录即可访问,基本流程如下:

  1. 首先在登录页面选中RememberMe然后登录成功;如果是浏览器登录,一般会把RememberMe的Cookie写到客户端并保存下来;
  2. 关闭浏览器再重新打开;会发现浏览器还是记住你的;
  3. 访问一般的网页服务器端还是知道你是谁,且能正常访问;

登录表单中添加记住我复选框

代码语言:javascript
复制
<body>
	<form action="login.do" method="post">
		账号:<input type="text" name="username" ><br/>
		密码:<input type="password" name="password"><br/>
		<input type="checkbox" name="rememberMe"/>记住密码<br/>
		<input type="submit" value="提交">
	</form>
</body>

配置文件中配置

代码语言:javascript
复制
<!-- remenberMe配置 -->
<bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
	<constructor-arg value="rememberMe" />
	<property name="httpOnly" value="true" /> 
	<!-- 默认记住7天(单位:秒) -->
	<property name="maxAge" value="604800" />
</bean> 
<!-- rememberMe管理器 -->
<bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">
	<property name="cipherKey" value="#{T(org.apache.shiro.codec.Base64).decode('4AvVhmFLUs0KTA3Kprsdag==')}" />
	<property name="cookie" ref="rememberMeCookie" />
</bean>

<!-- 注册SecurityManager -->
<bean class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"
	id="securityManager">
	<!-- 配置自定义Realm -->
	<property name="realm" ref="myRealm" />
	<property name="cacheManager" ref="cacheManager" />
	<!-- 注册rememberMe -->
	<property name="rememberMeManager" ref="rememberMeManager"/>
</bean>

注意:必须配置为 user级别,authc级别的rememberMe没有效果

在这里插入图片描述
在这里插入图片描述

  到此就可以测试了。登录的时候勾选记住密码关闭浏览器,再访问user级别的请求就直接可以访问了。但是因为此时并没有真正的认证,所以此时的session并不能使用,这时我们可以实现一个过滤器。来拦截rememberMe功能的请求即可

创建RememberMe的过滤器

代码语言:javascript
复制
/**
 * 自定义rememberMe的过滤器
 * @author dengp
 *
 */
public class RememberFormAuthenticationFilter extends FormAuthenticationFilter{

	@Override
	protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
		Subject subject = getSubject(request, response);
		Session session = subject.getSession();
		// 记住密码,没有登录isAuthenticated()肯定为false
		if(!subject.isAuthenticated()
				&&subject.isRemembered()
				&&session.getAttribute("msg")==null){
			System.out.println("记住的用户是:"+subject.getPrincipal());
			session.setAttribute("msg", "remember中保存的信息");
		}
		return subject.isAuthenticated()||subject.isRemembered();
	}
}

配置文件中修改

代码语言:javascript
复制
<!-- 注册rememberMe的过滤器 -->
<bean class="com.dpb.filter.RememberFormAuthenticationFilter" id="rememberFormAuthenticationFilter">
</bean>

<!-- 注册ShiroFilterFactoryBean 注意id必须和web.xml中注册的targetBeanName的值一致 -->
<bean class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"
	id="shiro">
	<!-- 注册SecurityManager -->
	<property name="securityManager" ref="securityManager" />
	<!-- 登录地址 如果用户请求的的地址是 login.do 那么会对该地址认证 -->
	<property name="loginUrl" value="/login.do" />
	<!-- 登录成功的跳转地址 -->
	<property name="successUrl" value="/jsp/success.jsp" />
	<!-- 访问未授权的页面跳转的地址 -->
	<property name="unauthorizedUrl" value="/jsp/refuse.jsp" />

	<property name="filters">
		<map>
			<entry key="authc" value-ref="customFormAuthenticationFilter" />
			<entry key="rememberMe" value-ref="rememberFormAuthenticationFilter" />
		</map>
	</property>
	<!-- 设置 过滤器链 -->
	<property name="filterChainDefinitions">
		<value>
			/login.do=authc
			/login.jsp=anon
			/logout=logout
			/**=rememberMe,user <!-- 必须配置为 user级别,authc级别的rememberMe没有效果 -->
		</value>
	</property>
</bean>
在这里插入图片描述
在这里插入图片描述

注意:如果我们在认证的AuthenticationInfo info = new SimpleAuthenticationInfo(user, pwd, credentialsSalt, “myrealm”); 保存的是自定义的对象,那么该对象必须实现Serializable接口,因为该对象要被持久化到cookie中!!!

测试

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年01月26日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • session
    • session常用方法
      • 实现登录成功后保存登录信息到session中
        • 创建FormAuthenticationFilter的子类重写onLoginSuccess方法
        • 配置文件中配置
        • 测试
    • remember me
      • 登录表单中添加记住我复选框
        • 配置文件中配置
          • 创建RememberMe的过滤器
            • 配置文件中修改
              • 测试
              相关产品与服务
              容器服务
              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档