服务器重启后怎么在shiro拦截前去手动通过cookie拿到redis里面的账号密码去进行shiro认证,而不是用户重新去登录一次
时间: 2024-04-18 07:30:52 浏览: 112
当服务器重启后,你可以通过Shiro的自定义过滤器来实现在拦截前手动获取Cookie,并从Redis中获取账号密码进行Shiro认证。下面是一个示例代码:
1. 创建一个自定义的Shiro过滤器,继承`FormAuthenticationFilter`,重写`executeLogin()`方法:
```java
public class CustomAuthenticationFilter extends FormAuthenticationFilter {
@Override
protected boolean executeLogin(ServletRequest request, ServletResponse response) throws Exception {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
// 从Cookie中获取sessionId
String sessionId = null;
Cookie[] cookies = httpServletRequest.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("sessionId".equals(cookie.getName())) {
sessionId = cookie.getValue();
break;
}
}
}
// 从Redis中获取账号密码
Jedis jedis = new Jedis("redis_host", redis_port);
String password = jedis.get(sessionId);
// 调用Shiro的登录方法进行认证
UsernamePasswordToken token = new UsernamePasswordToken(sessionId, password);
Subject subject = SecurityUtils.getSubject();
subject.login(token);
// 登录成功后重定向到原请求页面
issueSuccessRedirect(request, response);
return false;
}
}
```
2. 在Shiro配置文件中将自定义过滤器添加到过滤器链中:
```xml
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- ...其他配置... -->
<property name="filters">
<map>
<!-- ...其他过滤器配置... -->
<entry key="authc">
<bean class="com.example.CustomAuthenticationFilter">
<!-- 设置登录页的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>
```
通过以上步骤,在服务器重启后,当用户访问需要认证的页面时,Shiro会使用自定义过滤器中的逻辑,从Cookie中获取sessionId,并从Redis中获取账号密码进行Shiro认证。如果认证成功,用户将被自动登录,无需重新输入账号密码。
请注意,在实际生产环境中,你需要根据具体情况对Cookie和Redis进行适当的安全性加固和保护。
阅读全文