通用框架平台,每个分支对应子通用框架平台,禁止Merge不同分支!! 分支版本区别见项目内readme.md
whycxzp
2021-01-20 129bc8f0c9bce0306aa99fafde97689f645dbbb5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package com.whyc.manager;
 
import com.whyc.constant.SuperConstant;
import io.jsonwebtoken.Claims;
import org.apache.shiro.web.servlet.ShiroHttpServletRequest;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.apache.shiro.web.util.WebUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
 
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.Serializable;
 
public class ShiroSessionManager extends DefaultWebSessionManager {
 
    public ShiroSessionManager() {
    }
 
    @Autowired
    JWTManager jwtManager;
 
    @Override
    protected Serializable getSessionId(ServletRequest request, ServletResponse response) {
        //改变session模式后,解析携带的jwt
        String jwt = WebUtils.toHttp(request).getHeader(SuperConstant.AUTHORIZATION);
        if (StringUtils.isEmpty(jwt)){
            //如果没有携带jwt,则采用cookie方式
            return super.getSessionId(request,response);
        }else{
            //设置request属性为无状态,SessionId
            request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE,SuperConstant.REFERENCED_SESSION_ID_RESOURCE);
            try {
                Claims claims = jwtManager.decodeToken(jwt);
                String sessionId = (String) claims.get("jti");
                request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, sessionId);
                request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE);
                return sessionId;
            }catch (Exception e){
                //无法解密jwt,说明凭证有问题
                //e.printStackTrace();
                return null;
            }
        }
    }
}