需求用户登录过一次后,会将用户存贮到cookie中,并把cookie作为key将用户密码存储到redis中,服务器重启后,在从当前页面点击怎么实现免登录,框架是ssm +shiro
时间: 2024-04-15 10:29:41 浏览: 201
Java,使用Servlet、MySql、Html以及Cookie机制,实现简单的一定时间内免验证登录
在SSM框架中使用Shiro进行免登录功能的实现可以按照以下步骤进行:
1. 在用户登录成功后,生成一个唯一的标识符,例如UUID,并将其存储到Cookie中。可以使用`HttpServletResponse`对象的`addCookie()`方法来设置Cookie。
2. 将该标识符作为key,用户密码作为value,存储到Redis中。可以使用Redis的客户端库(例如Jedis)来连接Redis服务器并执行存储操作。
3. 在用户访问需要认证的页面时,通过Shiro的过滤器进行权限验证。在Shiro的配置文件中添加相应的过滤器和拦截规则。
4. 创建一个自定义的Shiro Realm,在其中重写`doGetAuthenticationInfo()`方法,用于从Redis中根据Cookie的值获取用户密码,并验证用户身份。
下面是一个简单示例代码:
1. 在登录成功后生成并设置Cookie:
```java
// 生成UUID作为标识符
String sessionId = UUID.randomUUID().toString();
// 将sessionId存储到Cookie中
Cookie cookie = new Cookie("sessionId", sessionId);
response.addCookie(cookie);
// 将sessionId和用户密码存储到Redis中
Jedis jedis = new Jedis("redis_host", redis_port);
jedis.set(sessionId, user.getPassword());
jedis.expire(sessionId, expire_time);
```
2. 在Shiro配置文件中添加过滤器和拦截规则:
```xml
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- ...其他配置... -->
<property name="filters">
<map>
<!-- ...其他过滤器配置... -->
<entry key="authc">
<bean class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter">
<!-- 设置登录页的URL -->
<property name="loginUrl" value="/login"/>
</bean>
</entry>
<entry key="user">
<bean class="org.apache.shiro.web.filter.authc.UserFilter"/>
</entry>
</map>
</property>
<property name="filterChainDefinitions">
<value>
/login = anon
/logout = logout
/** = user
</value>
</property>
</bean>
```
3. 创建自定义Shiro Realm并重写`doGetAuthenticationInfo()`方法:
```java
public class CustomRealm extends AuthorizingRealm {
// ...其他重写的方法...
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
if (!(token instanceof UsernamePasswordToken)) {
return null;
}
UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
String sessionId = usernamePasswordToken.getUsername();
// 从Redis中根据sessionId获取用户密码
Jedis jedis = new Jedis("redis_host", redis_port);
String password = jedis.get(sessionId);
if (password == null) {
throw new UnknownAccountException("Invalid session");
}
// 返回身份验证信息
return new SimpleAuthenticationInfo(sessionId, password, getName());
}
}
```
以上是一种基本的实现方式,你可以根据具体的业务需求进行适当调整和扩展。同时,请确保在生产环境中对Cookie和Redis的安全性进行合理的加固和保护。
阅读全文