shiro集成jwt怎么禁用session
发布时间:2023-05-14 03:03:28
shiro集成jwt后,可以禁用session,使得每个请求都携带jwt token,保证了无状态的访问。
要禁用session,需要在shiro的配置文件中进行相应的更改。
具体步骤如下:
1. 在shiro的配置文件中,禁用session:
<session-management>
<session-factory>
<bean class="org.apache.shiro.session.mgt.DefaultSessionManager">
<property name="sessionValidationSchedulerEnabled" value="false"/>
<property name="sessionDAO">
<bean class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO">
<property name="activeSessionsCacheName" value="shiro-activeSessionCache"/>
</bean>
</property>
</bean>
</session-factory>
</session-management>
这里将sessionValidationSchedulerEnabled设置为false,表示禁用session验证。
2. 在shiro的过滤器链中,添加JwtFilter过滤器:
<filter>
<filter-name>jwt</filter-name>
<filter-class>com.example.shiro.JwtFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>jwt</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这里将JwtFilter过滤器添加到了过滤器链中,并设置了url-pattern为/*,即所有请求都需要进行过滤。
3. 在JwtFilter过滤器中,验证jwt token:
public class JwtFilter extends AuthenticatingFilter {
@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
return false;
}
@Override
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
// 获取请求头中的jwt token
String token = getJwtToken(request);
if (StringUtils.isBlank(token)) {
// 如果请求头中没有jwt token,返回401未授权错误
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
return false;
}
// 验证jwt token的合法性
try {
JwtUtil.verify(token);
} catch (Exception e) {
// 如果jwt token不合法,返回401未授权错误
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
return false;
}
// 如果jwt token合法,放行
return true;
}
// 获取请求头中的jwt token
private String getJwtToken(ServletRequest request) {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String token = httpRequest.getHeader("Authorization");
if (StringUtils.isNotBlank(token) && token.startsWith("Bearer ")) {
return token.substring(7);
}
return null;
}
}
这里继承了shiro的AuthenticatingFilter类,重写了isAccessAllowed和onAccessDenied方法。isAccessAllowed方法设置为false,表示不对请求进行访问控制,而是交给onAccessDenied方法进行处理。在onAccessDenied方法中,首先获取请求头中的jwt token,如果token为空,返回401未授权错误;否则,验证jwt token的合法性,如果不合法,也返回401未授权错误;如果合法,放行。
到这里,就成功禁用了session,使用jwt保证了无状态的访问。
