欢迎访问宙启技术站
智能推送

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保证了无状态的访问。