shiro 默认是把 session id 存放在 cookie 中的,如果前后台同源会在请求的时候自动带上 cookie,这样子后台就可以从 cookie 中拿到 session id,但是如果跨域就无法获取到 cookie,所以 session id 每次都无法获取到,每次都会重新生成新的 session id。
    解决办法:自定义获取 session id 的方法,从请求头中获取,登陆接口返回 session id,前后端约定将 session id 放在请求头的 Authorization 字段中。
    OnlineWebSessionManager 自定义 session 管理器:

    1. public class OnlineWebSessionManager extends DefaultWebSessionManager {
    2. private static final Logger log = LoggerFactory.getLogger(OnlineWebSessionManager.class);
    3. /**
    4. * 自定义获取 session Id 类
    5. * @param request
    6. * @param response
    7. * @return
    8. */
    9. @Override
    10. public Serializable getSessionId(ServletRequest request, ServletResponse response) {
    11. return getReferencedSessionId(request, response);
    12. }
    13. /**
    14. * 获取sessionId从请求中
    15. *
    16. * @param request
    17. * @param response
    18. * @return
    19. */
    20. private Serializable getReferencedSessionId(ServletRequest request, ServletResponse response) {
    21. String id = getSessionIdCookieValue(request, response);
    22. if (id != null) {
    23. request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE, "cookie");
    24. } else {
    25. id = getUriPathSegmentParamValue(request);
    26. if (id == null) {
    27. // 获取请求头中的session
    28. id = WebUtils.toHttp(request).getHeader("Authorization");
    29. if (id == null) {
    30. String name = getSessionIdName();
    31. id = request.getParameter(name);
    32. if (id == null) {
    33. id = request.getParameter(name.toLowerCase());
    34. }
    35. }
    36. }
    37. if (id != null) {
    38. request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE, "url");
    39. }
    40. }
    41. if (id != null) {
    42. request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, id);
    43. request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE);
    44. }
    45. return id;
    46. }
    47. // copy from super class
    48. private String getSessionIdCookieValue(ServletRequest request, ServletResponse response) {
    49. if (!isSessionIdCookieEnabled()) {
    50. log.debug("Session ID cookie is disabled - session id will not be acquired from a request cookie.");
    51. return null;
    52. } else if (!(request instanceof HttpServletRequest)) {
    53. log.debug("Current request is not an HttpServletRequest - cannot get session ID cookie. Returning null.");
    54. return null;
    55. } else {
    56. HttpServletRequest httpRequest = (HttpServletRequest) request;
    57. return getSessionIdCookie().readValue(httpRequest, WebUtils.toHttp(response));
    58. }
    59. }
    60. // copy from super class
    61. private String getUriPathSegmentParamValue(ServletRequest servletRequest) {
    62. if (!(servletRequest instanceof HttpServletRequest)) {
    63. return null;
    64. } else {
    65. HttpServletRequest request = (HttpServletRequest) servletRequest;
    66. String uri = request.getRequestURI();
    67. if (uri == null) {
    68. return null;
    69. } else {
    70. int queryStartIndex = uri.indexOf(63);
    71. if (queryStartIndex >= 0) {
    72. uri = uri.substring(0, queryStartIndex);
    73. }
    74. int index = uri.indexOf(59);
    75. if (index < 0) {
    76. return null;
    77. } else {
    78. String TOKEN = "JSESSIONID" + "=";
    79. uri = uri.substring(index + 1);
    80. index = uri.lastIndexOf(TOKEN);
    81. if (index < 0) {
    82. return null;
    83. } else {
    84. uri = uri.substring(index + TOKEN.length());
    85. index = uri.indexOf(59);
    86. if (index >= 0) {
    87. uri = uri.substring(0, index);
    88. }
    89. return uri;
    90. }
    91. }
    92. }
    93. }
    94. }
    95. // copy from super class
    96. private String getSessionIdName() {
    97. String name = getSessionIdCookie() != null ? getSessionIdCookie().getName() : null;
    98. if (name == null) {
    99. name = "JSESSIONID";
    100. }
    101. return name;
    102. }
    103. }