Session.js 4.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. Ext.define('saas.model.Session', {
  2. extend: 'Ext.data.Model',
  3. fields: [
  4. { name: 'token', type: 'string' },
  5. { name: 'expire', type: 'number' },
  6. { name: 'timestamp', type: 'number' },
  7. { name: 'span', type: 'number' },
  8. { name: 'account' }
  9. ],
  10. statics: {
  11. login: function(username, password) {
  12. return new Ext.Promise(function (resolve, reject) {
  13. Ext.Ajax.request({
  14. url: '/api/auth/authorize',
  15. params: {
  16. username: username,
  17. password: password
  18. },
  19. method: 'POST',
  20. success: function (response) {
  21. var res = Ext.decode(response.responseText);
  22. if (res.success) {
  23. var session = saas.model.Session.loadData(res.data.token);
  24. session.set('account', res.data.account);
  25. // 服务端与本地存在时间差
  26. session.set('span', session.get('timestamp') - new Date().getTime());
  27. if (!session.isValid()) {
  28. reject({
  29. message: '登录失败,无效身份令牌'
  30. });
  31. } else {
  32. resolve(session);
  33. }
  34. } else {
  35. Ext.log.error('request failure with code: ', res.code, ', message: ', res.message);
  36. reject(res);
  37. }
  38. },
  39. failure: function (response) {
  40. Ext.log.error('server-side failure with status code: ', response.status);
  41. reject(response);
  42. }
  43. });
  44. });
  45. },
  46. switchCompany: function(oldSession, companyId) {
  47. return new Ext.Promise(function (resolve, reject) {
  48. Ext.Ajax.request({
  49. url: '/api/auth/switch/company',
  50. params: {
  51. companyId: companyId
  52. },
  53. method: 'GET',
  54. headers: {
  55. 'Authorization': oldSession.get('token')
  56. },
  57. success: function (response) {
  58. var res = Ext.decode(response.responseText);
  59. if (res.success) {
  60. var newSession = saas.model.Session.loadData(res.data);
  61. newSession.set('account', oldSession.get('account'));
  62. // 服务端与本地存在时间差
  63. newSession.set('span', newSession.get('timestamp') - new Date().getTime());
  64. if (!newSession.isValid()) {
  65. reject({
  66. message: '切换失败,无效身份令牌'
  67. });
  68. } else {
  69. resolve(newSession);
  70. }
  71. } else {
  72. Ext.log.error('request failure with code: ', res.code, ', message: ', res.message);
  73. reject(res);
  74. }
  75. },
  76. failure: function (response) {
  77. Ext.log.error('server-side failure with status code: ', response.status);
  78. reject(response);
  79. }
  80. });
  81. });
  82. }
  83. },
  84. isValid: function() {
  85. return !Ext.isEmpty(this.get('token')) && this.get('token').length > 128
  86. && this.get('timestamp') + this.get('expire') * 1000 > new Date().getTime() + this.get('span');
  87. },
  88. logout: function() {
  89. return new Ext.Promise(function (resolve, reject) {
  90. resolve({});
  91. });
  92. }
  93. });