Selaa lähdekoodia

增加token鉴权

xiongzhu 7 vuotta sitten
vanhempi
commit
e7d33fde28
56 muutettua tiedostoa jossa 788 lisäystä ja 227 poistoa
  1. 372 0
      log.txt
  2. 18 0
      pom.xml
  3. 17 0
      src/main/java/com/izouma/awesomeadmin/container/DateConverter.java
  4. 12 0
      src/main/java/com/izouma/awesomeadmin/dao/SysAppTokenMapper.java
  5. 15 0
      src/main/java/com/izouma/awesomeadmin/dao/SysAppTokenMapper.xml
  6. 1 2
      src/main/java/com/izouma/awesomeadmin/frame/GenController.java
  7. 0 36
      src/main/java/com/izouma/awesomeadmin/interceptor/CrossFilter.java
  8. 0 23
      src/main/java/com/izouma/awesomeadmin/interceptor/CrossInterceptor.java
  9. 36 0
      src/main/java/com/izouma/awesomeadmin/interceptor/GlobalInterceptor.java
  10. 2 4
      src/main/java/com/izouma/awesomeadmin/interceptor/PageInterceptor.java
  11. 10 0
      src/main/java/com/izouma/awesomeadmin/model/UserInfo.java
  12. 2 0
      src/main/java/com/izouma/awesomeadmin/service/UserInfoService.java
  13. 39 8
      src/main/java/com/izouma/awesomeadmin/service/impl/UserInfoServiceImpl.java
  14. 18 0
      src/main/java/com/izouma/awesomeadmin/shiro/AgileSubjectFactory.java
  15. 39 0
      src/main/java/com/izouma/awesomeadmin/shiro/AppToken.java
  16. 18 0
      src/main/java/com/izouma/awesomeadmin/shiro/AppTokenFilter.java
  17. 20 0
      src/main/java/com/izouma/awesomeadmin/shiro/AppTokenRealm.java
  18. 6 1
      src/main/java/com/izouma/awesomeadmin/shiro/MyExceptionResolver.java
  19. 0 24
      src/main/java/com/izouma/awesomeadmin/shiro/ShiroCrossFilter.java
  20. 1 1
      src/main/java/com/izouma/awesomeadmin/web/AssetsController.java
  21. 23 15
      src/main/java/com/izouma/awesomeadmin/web/AuthenticationController.java
  22. 0 21
      src/main/java/com/izouma/awesomeadmin/web/BaseController.java
  23. 1 2
      src/main/java/com/izouma/awesomeadmin/web/CommonQueryController.java
  24. 1 2
      src/main/java/com/izouma/awesomeadmin/web/DataSourceInfoController.java
  25. 1 2
      src/main/java/com/izouma/awesomeadmin/web/DepartInfoController.java
  26. 1 1
      src/main/java/com/izouma/awesomeadmin/web/DevelopController.java
  27. 1 2
      src/main/java/com/izouma/awesomeadmin/web/GenCodeController.java
  28. 1 1
      src/main/java/com/izouma/awesomeadmin/web/GenTestTableController.java
  29. 1 1
      src/main/java/com/izouma/awesomeadmin/web/MsgSenderController.java
  30. 1 1
      src/main/java/com/izouma/awesomeadmin/web/PowerInfoController.java
  31. 1 2
      src/main/java/com/izouma/awesomeadmin/web/QueryConfigController.java
  32. 1 1
      src/main/java/com/izouma/awesomeadmin/web/RongCloudController.java
  33. 1 1
      src/main/java/com/izouma/awesomeadmin/web/SysDataruleController.java
  34. 1 2
      src/main/java/com/izouma/awesomeadmin/web/SysMenuController.java
  35. 1 1
      src/main/java/com/izouma/awesomeadmin/web/SysRoleController.java
  36. 1 1
      src/main/java/com/izouma/awesomeadmin/web/TableFieldController.java
  37. 1 2
      src/main/java/com/izouma/awesomeadmin/web/TableShouyiYaopinxinxiController.java
  38. 1 2
      src/main/java/com/izouma/awesomeadmin/web/TestAaaController.java
  39. 1 2
      src/main/java/com/izouma/awesomeadmin/web/TestBbbController.java
  40. 1 2
      src/main/java/com/izouma/awesomeadmin/web/TestBbbCopyController.java
  41. 1 2
      src/main/java/com/izouma/awesomeadmin/web/TestCaidanController.java
  42. 1 2
      src/main/java/com/izouma/awesomeadmin/web/TestDeployController.java
  43. 1 2
      src/main/java/com/izouma/awesomeadmin/web/TestSqlserverAaaController.java
  44. 1 2
      src/main/java/com/izouma/awesomeadmin/web/TestaaaoneController.java
  45. 1 2
      src/main/java/com/izouma/awesomeadmin/web/TestgitController.java
  46. 1 1
      src/main/java/com/izouma/awesomeadmin/web/UserInfoController.java
  47. 1 7
      src/main/java/com/izouma/awesomeadmin/web/activiti/ModelController.java
  48. 1 6
      src/main/java/com/izouma/awesomeadmin/web/activiti/ProcessController.java
  49. 1 1
      src/main/resources/properties/log4j.properties
  50. 1 0
      src/main/resources/properties/outsidews.properties
  51. 10 11
      src/main/resources/spring/appDataSource.xml
  52. 18 10
      src/main/resources/spring/beans-shiro.xml
  53. 21 8
      src/main/resources/spring/spring-mvc.xml
  54. 1 1
      src/main/resources/templates/ControllerTemplate.vm
  55. 5 9
      src/main/webapp/WEB-INF/web.xml
  56. 56 0
      src/test/java/AppTokenTest.java

+ 372 - 0
log.txt

@@ -3,3 +3,375 @@
 [2018-07-31 16:17:38] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.
 [2018-07-31 16:18:06] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.
 [2018-07-31 16:18:27] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.
+[2018-08-07 16:36:56] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.
+[2018-08-07 16:38:01] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.
+[2018-08-07 16:39:11] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.
+[2018-08-07 16:41:25] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.
+[2018-08-07 16:53:52] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.
+[2018-08-07 17:16:04] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.
+[2018-08-07 17:18:19] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.
+[2018-08-07 17:50:23] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.
+[2018-08-07 17:56:01] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.
+[2018-08-07 18:03:44] [WARN ] - SQL State '08007' of Exception tested by statusOnException() implies that the database is invalid, and the pool should refill itself with fresh Connections.
+com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Communications link failure during rollback(). Transaction resolution unknown.
+	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
+	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
+	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
+	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
+	at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
+	at com.mysql.jdbc.Util.getInstance(Util.java:384)
+	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1013)
+	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
+	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:973)
+	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:918)
+	at com.mysql.jdbc.ConnectionImpl.rollback(ConnectionImpl.java:5086)
+	at com.mchange.v2.c3p0.impl.NewProxyConnection.rollback(NewProxyConnection.java:1033)
+	at org.springframework.jdbc.datasource.DataSourceTransactionManager.doRollback(DataSourceTransactionManager.java:294)
+	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:853)
+	at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:830)
+	at org.springframework.test.context.transaction.TransactionContext.endTransaction(TransactionContext.java:125)
+	at org.springframework.test.context.transaction.TransactionalTestExecutionListener.afterTestMethod(TransactionalTestExecutionListener.java:227)
+	at org.springframework.test.context.TestContextManager.afterTestMethod(TestContextManager.java:319)
+	at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:94)
+	at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
+	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
+	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252)
+	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
+	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
+	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
+	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
+	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
+	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
+	at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
+	at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
+	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
+	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
+	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
+	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
+	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
+	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
+	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
+[2018-08-07 18:03:44] [ERROR] - Error while closing command context
+org.apache.ibatis.exceptions.PersistenceException: 
+### Error querying database.  Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
+
+The last packet successfully received from the server was 432,744 milliseconds ago.  The last packet sent successfully to the server was 18,341 milliseconds ago.
+### The error may exist in org/activiti/db/mapping/entity/Job.xml
+### The error may involve org.activiti.engine.impl.persistence.entity.JobEntity.selectNextJobsToExecute-Inline
+### The error occurred while setting parameters
+### SQL: select       RES.*            from ACT_RU_JOB RES          LEFT OUTER JOIN ACT_RU_EXECUTION PI ON PI.ID_ = RES.PROCESS_INSTANCE_ID_     where (RES.RETRIES_ > 0)       and (RES.DUEDATE_ is null or RES.DUEDATE_ <= ?)       and (RES.LOCK_OWNER_ is null or RES.LOCK_EXP_TIME_ <= ?)      and (         (RES.EXECUTION_ID_ is null)        or         (PI.SUSPENSION_STATE_ = 1)       )       LIMIT ? OFFSET ?
+### Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
+
+The last packet successfully received from the server was 432,744 milliseconds ago.  The last packet sent successfully to the server was 18,341 milliseconds ago.
+	at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
+	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:122)
+	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:113)
+	at org.activiti.engine.impl.db.DbSqlSession.selectListWithRawParameter(DbSqlSession.java:440)
+	at org.activiti.engine.impl.db.DbSqlSession.selectList(DbSqlSession.java:431)
+	at org.activiti.engine.impl.db.DbSqlSession.selectList(DbSqlSession.java:426)
+	at org.activiti.engine.impl.db.DbSqlSession.selectList(DbSqlSession.java:409)
+	at org.activiti.engine.impl.persistence.entity.JobEntityManager.findNextJobsToExecute(JobEntityManager.java:150)
+	at org.activiti.engine.impl.cmd.AcquireJobsCmd.execute(AcquireJobsCmd.java:50)
+	at org.activiti.engine.impl.cmd.AcquireJobsCmd.execute(AcquireJobsCmd.java:33)
+	at org.activiti.engine.impl.interceptor.CommandInvoker.execute(CommandInvoker.java:24)
+	at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:57)
+	at org.activiti.spring.SpringTransactionInterceptor$1.doInTransaction(SpringTransactionInterceptor.java:47)
+	at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133)
+	at org.activiti.spring.SpringTransactionInterceptor.execute(SpringTransactionInterceptor.java:45)
+	at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:31)
+	at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:40)
+	at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:35)
+	at org.activiti.engine.impl.jobexecutor.AcquireJobsRunnableImpl.run(AcquireJobsRunnableImpl.java:54)
+	at java.lang.Thread.run(Thread.java:748)
+Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
+
+The last packet successfully received from the server was 432,744 milliseconds ago.  The last packet sent successfully to the server was 18,341 milliseconds ago.
+	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
+	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
+	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
+	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
+	at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
+	at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1127)
+	at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3715)
+	at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3604)
+	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4155)
+	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2615)
+	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2776)
+	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2838)
+	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2082)
+	at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1307)
+	at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.execute(NewProxyPreparedStatement.java:67)
+	at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:62)
+	at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:78)
+	at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62)
+	at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:303)
+	at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:154)
+	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:102)
+	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:82)
+	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:120)
+	... 18 more
+Caused by: java.net.SocketException: Operation timed out (Read failed)
+	at java.net.SocketInputStream.socketRead0(Native Method)
+	at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
+	at java.net.SocketInputStream.read(SocketInputStream.java:171)
+	at java.net.SocketInputStream.read(SocketInputStream.java:141)
+	at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:112)
+	at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:159)
+	at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:187)
+	at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3158)
+	at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3615)
+	... 34 more
+[2018-08-07 18:03:44] [WARN ] - A ConnectionTest has failed, reporting that all previously acquired Connections are likely invalid. The pool will be reset.
+[2018-08-07 18:03:44] [WARN ] - [c3p0] A PooledConnection that has already signalled a Connection error is still in use!
+[2018-08-07 18:03:44] [WARN ] - [c3p0] Another error has occurred [ com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed. ] which will not be reported to listeners!
+com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
+	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
+	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
+	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
+	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
+	at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
+	at com.mysql.jdbc.Util.getInstance(Util.java:384)
+	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1013)
+	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
+	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:973)
+	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:918)
+	at com.mysql.jdbc.ConnectionImpl.throwConnectionClosedException(ConnectionImpl.java:1321)
+	at com.mysql.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.java:1313)
+	at com.mysql.jdbc.ConnectionImpl.rollback(ConnectionImpl.java:5046)
+	at com.mchange.v2.c3p0.impl.NewProxyConnection.rollback(NewProxyConnection.java:1033)
+	at org.springframework.jdbc.datasource.DataSourceTransactionManager.doRollback(DataSourceTransactionManager.java:294)
+	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:853)
+	at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:830)
+	at org.springframework.transaction.support.TransactionTemplate.rollbackOnException(TransactionTemplate.java:164)
+	at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:137)
+	at org.activiti.spring.SpringTransactionInterceptor.execute(SpringTransactionInterceptor.java:45)
+	at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:31)
+	at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:40)
+	at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:35)
+	at org.activiti.engine.impl.jobexecutor.AcquireJobsRunnableImpl.run(AcquireJobsRunnableImpl.java:54)
+	at java.lang.Thread.run(Thread.java:748)
+[2018-08-07 18:03:44] [WARN ] - [c3p0] A PooledConnection that has already signalled a Connection error is still in use!
+[2018-08-07 18:03:44] [WARN ] - [c3p0] Another error has occurred [ com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed. ] which will not be reported to listeners!
+com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
+	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
+	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
+	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
+	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
+	at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
+	at com.mysql.jdbc.Util.getInstance(Util.java:384)
+	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1013)
+	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
+	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:973)
+	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:918)
+	at com.mysql.jdbc.ConnectionImpl.throwConnectionClosedException(ConnectionImpl.java:1321)
+	at com.mysql.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.java:1313)
+	at com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:5311)
+	at com.mchange.v2.c3p0.impl.NewProxyConnection.setAutoCommit(NewProxyConnection.java:1059)
+	at org.springframework.jdbc.datasource.DataSourceTransactionManager.doCleanupAfterCompletion(DataSourceTransactionManager.java:324)
+	at org.springframework.transaction.support.AbstractPlatformTransactionManager.cleanupAfterCompletion(AbstractPlatformTransactionManager.java:1016)
+	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:883)
+	at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:830)
+	at org.springframework.transaction.support.TransactionTemplate.rollbackOnException(TransactionTemplate.java:164)
+	at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:137)
+	at org.activiti.spring.SpringTransactionInterceptor.execute(SpringTransactionInterceptor.java:45)
+	at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:31)
+	at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:40)
+	at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:35)
+	at org.activiti.engine.impl.jobexecutor.AcquireJobsRunnableImpl.run(AcquireJobsRunnableImpl.java:54)
+	at java.lang.Thread.run(Thread.java:748)
+[2018-08-07 18:03:44] [ERROR] - Application exception overridden by rollback exception
+org.apache.ibatis.exceptions.PersistenceException: 
+### Error querying database.  Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
+
+The last packet successfully received from the server was 432,744 milliseconds ago.  The last packet sent successfully to the server was 18,341 milliseconds ago.
+### The error may exist in org/activiti/db/mapping/entity/Job.xml
+### The error may involve org.activiti.engine.impl.persistence.entity.JobEntity.selectNextJobsToExecute-Inline
+### The error occurred while setting parameters
+### SQL: select       RES.*            from ACT_RU_JOB RES          LEFT OUTER JOIN ACT_RU_EXECUTION PI ON PI.ID_ = RES.PROCESS_INSTANCE_ID_     where (RES.RETRIES_ > 0)       and (RES.DUEDATE_ is null or RES.DUEDATE_ <= ?)       and (RES.LOCK_OWNER_ is null or RES.LOCK_EXP_TIME_ <= ?)      and (         (RES.EXECUTION_ID_ is null)        or         (PI.SUSPENSION_STATE_ = 1)       )       LIMIT ? OFFSET ?
+### Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
+
+The last packet successfully received from the server was 432,744 milliseconds ago.  The last packet sent successfully to the server was 18,341 milliseconds ago.
+	at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
+	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:122)
+	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:113)
+	at org.activiti.engine.impl.db.DbSqlSession.selectListWithRawParameter(DbSqlSession.java:440)
+	at org.activiti.engine.impl.db.DbSqlSession.selectList(DbSqlSession.java:431)
+	at org.activiti.engine.impl.db.DbSqlSession.selectList(DbSqlSession.java:426)
+	at org.activiti.engine.impl.db.DbSqlSession.selectList(DbSqlSession.java:409)
+	at org.activiti.engine.impl.persistence.entity.JobEntityManager.findNextJobsToExecute(JobEntityManager.java:150)
+	at org.activiti.engine.impl.cmd.AcquireJobsCmd.execute(AcquireJobsCmd.java:50)
+	at org.activiti.engine.impl.cmd.AcquireJobsCmd.execute(AcquireJobsCmd.java:33)
+	at org.activiti.engine.impl.interceptor.CommandInvoker.execute(CommandInvoker.java:24)
+	at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:57)
+	at org.activiti.spring.SpringTransactionInterceptor$1.doInTransaction(SpringTransactionInterceptor.java:47)
+	at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133)
+	at org.activiti.spring.SpringTransactionInterceptor.execute(SpringTransactionInterceptor.java:45)
+	at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:31)
+	at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:40)
+	at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:35)
+	at org.activiti.engine.impl.jobexecutor.AcquireJobsRunnableImpl.run(AcquireJobsRunnableImpl.java:54)
+	at java.lang.Thread.run(Thread.java:748)
+Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
+
+The last packet successfully received from the server was 432,744 milliseconds ago.  The last packet sent successfully to the server was 18,341 milliseconds ago.
+	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
+	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
+	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
+	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
+	at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
+	at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1127)
+	at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3715)
+	at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3604)
+	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4155)
+	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2615)
+	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2776)
+	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2838)
+	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2082)
+	at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1307)
+	at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.execute(NewProxyPreparedStatement.java:67)
+	at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:62)
+	at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:78)
+	at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62)
+	at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:303)
+	at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:154)
+	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:102)
+	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:82)
+	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:120)
+	... 18 more
+Caused by: java.net.SocketException: Operation timed out (Read failed)
+	at java.net.SocketInputStream.socketRead0(Native Method)
+	at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
+	at java.net.SocketInputStream.read(SocketInputStream.java:171)
+	at java.net.SocketInputStream.read(SocketInputStream.java:141)
+	at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:112)
+	at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:159)
+	at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:187)
+	at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3158)
+	at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3615)
+	... 34 more
+[2018-08-07 18:03:44] [ERROR] - exception during job acquisition: Could not roll back JDBC transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
+org.springframework.transaction.TransactionSystemException: Could not roll back JDBC transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
+	at org.springframework.jdbc.datasource.DataSourceTransactionManager.doRollback(DataSourceTransactionManager.java:297)
+	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:853)
+	at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:830)
+	at org.springframework.transaction.support.TransactionTemplate.rollbackOnException(TransactionTemplate.java:164)
+	at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:137)
+	at org.activiti.spring.SpringTransactionInterceptor.execute(SpringTransactionInterceptor.java:45)
+	at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:31)
+	at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:40)
+	at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:35)
+	at org.activiti.engine.impl.jobexecutor.AcquireJobsRunnableImpl.run(AcquireJobsRunnableImpl.java:54)
+	at java.lang.Thread.run(Thread.java:748)
+Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
+	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
+	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
+	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
+	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
+	at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
+	at com.mysql.jdbc.Util.getInstance(Util.java:384)
+	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1013)
+	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
+	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:973)
+	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:918)
+	at com.mysql.jdbc.ConnectionImpl.throwConnectionClosedException(ConnectionImpl.java:1321)
+	at com.mysql.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.java:1313)
+	at com.mysql.jdbc.ConnectionImpl.rollback(ConnectionImpl.java:5046)
+	at com.mchange.v2.c3p0.impl.NewProxyConnection.rollback(NewProxyConnection.java:1033)
+	at org.springframework.jdbc.datasource.DataSourceTransactionManager.doRollback(DataSourceTransactionManager.java:294)
+	... 10 more
+[2018-08-07 18:03:44] [WARN ] - [c3p0] A PooledConnection that has already signalled a Connection error is still in use!
+[2018-08-07 18:03:44] [WARN ] - [c3p0] Another error has occurred [ com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
+
+The last packet successfully received from the server was 460,935 milliseconds ago.  The last packet sent successfully to the server was 18,355 milliseconds ago. ] which will not be reported to listeners!
+com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
+
+The last packet successfully received from the server was 460,935 milliseconds ago.  The last packet sent successfully to the server was 18,355 milliseconds ago.
+	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
+	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
+	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
+	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
+	at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
+	at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1127)
+	at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3983)
+	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2596)
+	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2776)
+	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2832)
+	at com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:5357)
+	at com.mchange.v2.c3p0.impl.NewProxyConnection.setAutoCommit(NewProxyConnection.java:1059)
+	at org.springframework.jdbc.datasource.DataSourceTransactionManager.doCleanupAfterCompletion(DataSourceTransactionManager.java:324)
+	at org.springframework.transaction.support.AbstractPlatformTransactionManager.cleanupAfterCompletion(AbstractPlatformTransactionManager.java:1016)
+	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:883)
+	at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:830)
+	at org.springframework.test.context.transaction.TransactionContext.endTransaction(TransactionContext.java:125)
+	at org.springframework.test.context.transaction.TransactionalTestExecutionListener.afterTestMethod(TransactionalTestExecutionListener.java:227)
+	at org.springframework.test.context.TestContextManager.afterTestMethod(TestContextManager.java:319)
+	at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:94)
+	at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
+	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
+	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252)
+	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
+	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
+	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
+	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
+	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
+	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
+	at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
+	at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
+	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
+	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
+	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
+	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
+	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
+	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
+	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
+Caused by: java.net.SocketException: Broken pipe (Write failed)
+	at java.net.SocketOutputStream.socketWrite0(Native Method)
+	at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)
+	at java.net.SocketOutputStream.write(SocketOutputStream.java:155)
+	at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
+	at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
+	at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3964)
+	... 31 more
+[2018-08-07 18:03:44] [WARN ] - Caught exception while allowing TestExecutionListener [org.springframework.test.context.transaction.TransactionalTestExecutionListener@60652518] to process 'after' execution for test: method [public void AppTokenTest.parseToken()], instance [AppTokenTest@438aaa9f], exception [null]
+org.springframework.transaction.TransactionSystemException: Could not roll back JDBC transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Communications link failure during rollback(). Transaction resolution unknown.
+	at org.springframework.jdbc.datasource.DataSourceTransactionManager.doRollback(DataSourceTransactionManager.java:297)
+	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:853)
+	at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:830)
+	at org.springframework.test.context.transaction.TransactionContext.endTransaction(TransactionContext.java:125)
+	at org.springframework.test.context.transaction.TransactionalTestExecutionListener.afterTestMethod(TransactionalTestExecutionListener.java:227)
+	at org.springframework.test.context.TestContextManager.afterTestMethod(TestContextManager.java:319)
+	at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:94)
+	at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
+	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
+	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252)
+	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
+	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
+	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
+	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
+	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
+	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
+	at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
+	at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
+	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
+	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
+	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
+	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
+	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
+	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
+	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
+Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Communications link failure during rollback(). Transaction resolution unknown.
+	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
+	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
+	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
+	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
+	at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
+	at com.mysql.jdbc.Util.getInstance(Util.java:384)
+	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1013)
+	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
+	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:973)
+	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:918)
+	at com.mysql.jdbc.ConnectionImpl.rollback(ConnectionImpl.java:5086)
+	at com.mchange.v2.c3p0.impl.NewProxyConnection.rollback(NewProxyConnection.java:1033)
+	at org.springframework.jdbc.datasource.DataSourceTransactionManager.doRollback(DataSourceTransactionManager.java:294)
+	... 24 more
+[2018-08-07 18:03:49] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.

+ 18 - 0
pom.xml

@@ -961,6 +961,24 @@
             <!--<version>1.1.2</version>-->
             <!--<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/ueditor-1.1.2.jar</systemPath>-->
         <!--</dependency>-->
+
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt-api</artifactId>
+            <version>0.10.1</version>
+        </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt-impl</artifactId>
+            <version>0.10.1</version>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt-jackson</artifactId>
+            <version>0.10.1</version>
+            <scope>runtime</scope>
+        </dependency>
     </dependencies>
 
 </project>

+ 17 - 0
src/main/java/com/izouma/awesomeadmin/container/DateConverter.java

@@ -0,0 +1,17 @@
+package com.izouma.awesomeadmin.container;
+
+import org.springframework.core.convert.converter.Converter;
+
+import java.util.Date;
+
+public class DateConverter implements Converter<String, Date> {
+    @Override
+    public Date convert(String source) {
+        try {
+            return new Date(Long.valueOf(source));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}

+ 12 - 0
src/main/java/com/izouma/awesomeadmin/dao/SysAppTokenMapper.java

@@ -0,0 +1,12 @@
+package com.izouma.awesomeadmin.dao;
+
+import com.izouma.awesomeadmin.shiro.AppToken;
+import org.apache.ibatis.annotations.Param;
+
+public interface SysAppTokenMapper {
+    int saveToken(@Param("userId") Integer userId, @Param("token") String token);
+
+    AppToken getToken(String token);
+
+    int delToken(String token);
+}

+ 15 - 0
src/main/java/com/izouma/awesomeadmin/dao/SysAppTokenMapper.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.izouma.awesomeadmin.dao.SysAppTokenMapper">
+    <insert id="saveToken">
+        insert into sys_app_token (user_id, token)
+        values (#{userId}, #{token})
+    </insert>
+    <delete id="delToken">
+        delete from sys_app_token where token = #{token}
+    </delete>
+    <select id="getToken" resultType="com.izouma.awesomeadmin.shiro.AppToken">
+        select * from sys_app_token where token = #{token}
+    </select>
+
+</mapper>

+ 1 - 2
src/main/java/com/izouma/awesomeadmin/frame/GenController.java

@@ -1,7 +1,6 @@
 package com.izouma.awesomeadmin.frame;
 
 import com.izouma.awesomeadmin.dto.Result;
-import com.izouma.awesomeadmin.web.BaseController;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
@@ -15,7 +14,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
  */
 @Controller
 @RequestMapping("/gen")
-public class GenController extends BaseController {
+public class GenController {
 
 
     @RequestMapping(value = "/byTable", method = RequestMethod.GET)

+ 0 - 36
src/main/java/com/izouma/awesomeadmin/interceptor/CrossFilter.java

@@ -1,36 +0,0 @@
-package com.izouma.awesomeadmin.interceptor;
-
-
-import javax.servlet.*;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-/**
- * Created by xiong on 2017/6/16.
- */
-public class CrossFilter implements Filter {
-
-    @Override
-    public void init(FilterConfig filterConfig) throws ServletException {
-
-    }
-
-    @Override
-    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
-        HttpServletResponse response = (HttpServletResponse) servletResponse;
-        HttpServletRequest request = (HttpServletRequest) servletRequest;
-        String sessionId = request.getSession().getId();
-        response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
-        response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH");
-        response.setHeader("Access-Control-Max-Age", "100");
-        response.setHeader("Access-Control-Allow-Headers", "Content-Type");
-        response.setHeader("Access-Control-Allow-Credentials", "true");
-        filterChain.doFilter(request, response);
-    }
-
-    @Override
-    public void destroy() {
-
-    }
-}

+ 0 - 23
src/main/java/com/izouma/awesomeadmin/interceptor/CrossInterceptor.java

@@ -1,23 +0,0 @@
-package com.izouma.awesomeadmin.interceptor;
-
-import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * Created by xiong on 2017/6/16.
- */
-public class CrossInterceptor extends HandlerInterceptorAdapter {
-
-    @Override
-    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
-        response.addHeader("Access-Control-Allow-Origin", "*");
-        response.addHeader("Access-Control-Allow-Methods", "*");
-        response.addHeader("Access-Control-Max-Age", "100");
-        response.addHeader("Access-Control-Allow-Headers", "Content-Type");
-        response.addHeader("Access-Control-Allow-Credentials", "false");
-        return super.preHandle(request, response, handler);
-    }
-
-}

+ 36 - 0
src/main/java/com/izouma/awesomeadmin/interceptor/GlobalInterceptor.java

@@ -0,0 +1,36 @@
+package com.izouma.awesomeadmin.interceptor;
+
+import com.izouma.awesomeadmin.shiro.AppToken;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.subject.Subject;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Created by xiong on 2017/6/16.
+ */
+public class GlobalInterceptor extends HandlerInterceptorAdapter {
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        Subject subject = SecurityUtils.getSubject();
+        if (!subject.isAuthenticated()) {
+            String token = request.getHeader("token");
+            AppToken appToken = new AppToken(token);
+            try {
+                subject.login(appToken);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        response.addHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
+        response.addHeader("Access-Control-Allow-Methods", "*");
+        response.addHeader("Access-Control-Max-Age", "100");
+        response.addHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
+        response.addHeader("Access-Control-Allow-Credentials", "true");
+        return super.preHandle(request, response, handler);
+    }
+
+}

+ 2 - 4
src/main/java/com/izouma/awesomeadmin/interceptor/PageInterceptor.java

@@ -126,11 +126,9 @@ public class PageInterceptor implements Interceptor {
     public static String getDataBaseType(Connection connection) {
         //通过driverName是否包含关键字判断
         try {
-            if (connection.getMetaData().getDriverName().toUpperCase()
-                    .indexOf("MYSQL") != -1) {
+            if (connection.getMetaData().getDriverName().toUpperCase().contains("MYSQL")) {
                 return "MySql";
-            } else if (connection.getMetaData().getDriverName().toUpperCase()
-                    .indexOf("SQL SERVER") != -1) {
+            } else if (connection.getMetaData().getDriverName().toUpperCase().contains("SQL SERVER")) {
                 //sqljdbc与sqljdbc4不同,sqlserver中间有空格
                 return "SqlServer";
             }

+ 10 - 0
src/main/java/com/izouma/awesomeadmin/model/UserInfo.java

@@ -51,6 +51,16 @@ public class UserInfo{
 
 	private String departId;
 
+	private String token;
+
+	public String getToken() {
+		return token;
+	}
+
+	public void setToken(String token) {
+		this.token = token;
+	}
+
 	public String getDepartId() {
 		return departId;
 	}

+ 2 - 0
src/main/java/com/izouma/awesomeadmin/service/UserInfoService.java

@@ -30,6 +30,8 @@ public interface UserInfoService {
 
     UserInfo loginSms(String phone, String code, String sessionId) throws UserInfoServiceImpl.LoginException;
 
+    UserInfo loginAppToken(String token);
+
     List<String> findDepartLeader(String userId);
 
     List<String> findUserByRoleName(String roleName);

+ 39 - 8
src/main/java/com/izouma/awesomeadmin/service/impl/UserInfoServiceImpl.java

@@ -1,17 +1,19 @@
 package com.izouma.awesomeadmin.service.impl;
 
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 import com.izouma.awesomeadmin.constant.AppConstant;
 import com.izouma.awesomeadmin.dao.DepartInfoMapper;
+import com.izouma.awesomeadmin.dao.SysAppTokenMapper;
 import com.izouma.awesomeadmin.dao.SysRoleMapper;
 import com.izouma.awesomeadmin.dto.Page;
-import com.izouma.awesomeadmin.model.SysRole;
+import com.izouma.awesomeadmin.shiro.AppToken;
 import com.izouma.awesomeadmin.util.MD5Util;
 import com.izouma.awesomeadmin.util.PropertiesFileLoader;
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.Jwt;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.security.Keys;
 import io.rong.RongCloud;
 import io.rong.models.SMSVerifyCodeResult;
 import org.apache.commons.lang.StringUtils;
@@ -23,6 +25,8 @@ import com.izouma.awesomeadmin.dao.UserInfoMapper;
 import com.izouma.awesomeadmin.model.UserInfo;
 import com.izouma.awesomeadmin.service.UserInfoService;
 
+import javax.crypto.SecretKey;
+
 /**
  * user_info service接口实现类
  * Tue Apr 17 10:32:49 CST 2018  Suo Chen Cheng
@@ -35,11 +39,13 @@ public class UserInfoServiceImpl implements UserInfoService {
 
 
     @Autowired
-    private UserInfoMapper   userInfoMapper;
+    private UserInfoMapper    userInfoMapper;
+    @Autowired
+    private SysRoleMapper     sysRoleMapper;
     @Autowired
-    private SysRoleMapper    sysRoleMapper;
+    private DepartInfoMapper  departInfoMapper;
     @Autowired
-    private DepartInfoMapper departInfoMapper;
+    private SysAppTokenMapper sysAppTokenMapper;
 
     @Override
     public List<UserInfo> getUserInfoList(UserInfo record) {
@@ -217,6 +223,31 @@ public class UserInfoServiceImpl implements UserInfoService {
         throw new LoginException("验证码错误");
     }
 
+    @Override
+    public UserInfo loginAppToken(String token) {
+        logger.info("loginAppToken");
+        UserInfo userInfo = null;
+        try {
+            AppToken appToken = sysAppTokenMapper.getToken(token);
+            if (appToken != null) {
+                SecretKey key = Keys.hmacShaKeyFor(Base64.getDecoder().decode(PropertiesFileLoader.getProperties("jwtsecret").getBytes()));
+                Jwt jwt = Jwts.parser()
+                        .setSigningKey(key)
+                        .parse(token);
+                Claims claims = (Claims) jwt.getBody();
+                if (claims.getExpiration() != null) {
+                    if (claims.getExpiration().before(new Date())) {
+                        return null;
+                    }
+                }
+                userInfo = getUserInfoById(claims.getSubject());
+            }
+        } catch (Exception e) {
+            logger.error("loginAppToken", e);
+        }
+        return userInfo;
+    }
+
     @Override
     public List<String> findDepartLeader(String userId) {
         logger.info("findDepartLeader");

+ 18 - 0
src/main/java/com/izouma/awesomeadmin/shiro/AgileSubjectFactory.java

@@ -0,0 +1,18 @@
+package com.izouma.awesomeadmin.shiro;
+
+import org.apache.shiro.authc.AuthenticationToken;
+import org.apache.shiro.subject.Subject;
+import org.apache.shiro.subject.SubjectContext;
+import org.apache.shiro.web.mgt.DefaultWebSubjectFactory;
+
+public class AgileSubjectFactory extends DefaultWebSubjectFactory {
+
+    public Subject createSubject(SubjectContext context) {
+        AuthenticationToken token = context.getAuthenticationToken();
+        if ((token instanceof AppToken)) {
+            // 当token为AppToken时, 不创建 session
+            context.setSessionCreationEnabled(false);
+        }
+        return super.createSubject(context);
+    }
+}

+ 39 - 0
src/main/java/com/izouma/awesomeadmin/shiro/AppToken.java

@@ -0,0 +1,39 @@
+package com.izouma.awesomeadmin.shiro;
+
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import org.apache.shiro.authc.AuthenticationToken;
+
+
+@JsonAutoDetect
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class AppToken implements AuthenticationToken {
+    private String token;
+
+    public AppToken() {
+    }
+
+    public AppToken(String token) {
+        this.token = token;
+    }
+
+    public String getToken() {
+        return token;
+    }
+
+    public void setToken(String token) {
+        this.token = token;
+    }
+
+    @Override
+    public Object getPrincipal() {
+        return token;
+    }
+
+    @Override
+    public Object getCredentials() {
+        return token;
+    }
+}
+

+ 18 - 0
src/main/java/com/izouma/awesomeadmin/shiro/AppTokenFilter.java

@@ -0,0 +1,18 @@
+package com.izouma.awesomeadmin.shiro;
+
+import org.apache.shiro.web.filter.AccessControlFilter;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+public class AppTokenFilter extends AccessControlFilter {
+    @Override
+    protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) throws Exception {
+        return false;
+    }
+
+    @Override
+    protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {
+        return false;
+    }
+}

+ 20 - 0
src/main/java/com/izouma/awesomeadmin/shiro/AppTokenRealm.java

@@ -0,0 +1,20 @@
+package com.izouma.awesomeadmin.shiro;
+
+import com.izouma.awesomeadmin.model.UserInfo;
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.authc.AuthenticationInfo;
+import org.apache.shiro.authc.AuthenticationToken;
+import org.apache.shiro.authc.SimpleAuthenticationInfo;
+
+public class AppTokenRealm extends BaseRealm {
+    @Override
+    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
+        UserInfo userInfo = null;
+        AppToken token = (AppToken) authenticationToken;
+        userInfo = userInfoService.loginAppToken(token.getToken());
+        if (userInfo == null) {
+            throw new AuthenticationException("token无效");
+        }
+        return new SimpleAuthenticationInfo(userInfo, token.getCredentials(), this.getName());
+    }
+}

+ 6 - 1
src/main/java/com/izouma/awesomeadmin/shiro/MyExceptionResolver.java

@@ -1,5 +1,6 @@
 package com.izouma.awesomeadmin.shiro;
 
+import org.apache.shiro.authc.AuthenticationException;
 import org.apache.shiro.authz.UnauthenticatedException;
 import org.apache.shiro.authz.UnauthorizedException;
 import org.springframework.web.servlet.HandlerExceptionResolver;
@@ -19,7 +20,11 @@ public class MyExceptionResolver implements HandlerExceptionResolver {
         } else if (e instanceof UnauthenticatedException) {
             mav.addObject("error", "未登录");
             mav.addObject("code", 10001);
-        }else {
+        } else if (e instanceof AuthenticationException) {
+            mav.addObject("error", e.getMessage());
+            mav.addObject("code", 10001);
+        } else {
+            mav.addObject("error", e.getMessage());
             e.printStackTrace();
         }
         mav.addObject("success", false);

+ 0 - 24
src/main/java/com/izouma/awesomeadmin/shiro/ShiroCrossFilter.java

@@ -1,24 +0,0 @@
-package com.izouma.awesomeadmin.shiro;
-
-import org.apache.shiro.web.servlet.AdviceFilter;
-import org.springframework.http.HttpStatus;
-import org.springframework.web.bind.annotation.RequestMethod;
-
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-public class ShiroCrossFilter extends AdviceFilter {
-    @Override
-    protected boolean preHandle(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {
-        HttpServletRequest request = (HttpServletRequest) servletRequest;
-        HttpServletResponse response = (HttpServletResponse) servletResponse;
-        String sessionId = request.getSession().getId();
-        if (request.getMethod().equals(RequestMethod.OPTIONS.name())) {
-            response.setStatus(HttpStatus.OK.value());
-            return false;
-        }
-        return super.preHandle(request, response);
-    }
-}

+ 1 - 1
src/main/java/com/izouma/awesomeadmin/web/AssetsController.java

@@ -22,7 +22,7 @@ import java.util.Iterator;
  */
 @Controller
 @RequestMapping("/assets")
-public class AssetsController extends BaseController{
+public class AssetsController {
 
     @Autowired
     private OSSFileService OSSFileService;

+ 23 - 15
src/main/java/com/izouma/awesomeadmin/web/AuthImageController.java → src/main/java/com/izouma/awesomeadmin/web/AuthenticationController.java

@@ -1,45 +1,53 @@
 package com.izouma.awesomeadmin.web;
 
+import com.google.common.collect.Maps;
 import com.izouma.awesomeadmin.dto.Result;
+import com.izouma.awesomeadmin.model.UserInfo;
+import com.izouma.awesomeadmin.util.PropertiesFileLoader;
 import com.izouma.awesomeadmin.util.VerifyCodeUtils;
+import io.jsonwebtoken.CompressionCodecs;
+import io.jsonwebtoken.JwtBuilder;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm;
+import io.jsonwebtoken.security.Keys;
+import org.apache.commons.lang.StringUtils;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 
+import javax.crypto.SecretKey;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
+import javax.xml.bind.DatatypeConverter;
 import java.io.IOException;
+import java.util.Base64;
+import java.util.Date;
+import java.util.Map;
+import java.util.UUID;
 
-/**
- * 
- * <p>验证图片。</p> 
- * 
- * @version 1.0
- * @author 姓名 <br />
- * 更新履历 <br />
- *  日期 : 姓名: 更新内容<br />
- */
 @Controller
 @RequestMapping("/auth")
-public class AuthImageController extends BaseController {
+public class AuthenticationController {
+
+    private final String SECRET_KEY = "*(-=4eklfasdfarerf41585fdasf";
 
     @RequestMapping(value = "/image", method = RequestMethod.GET)
     @ResponseBody
     public Result image(HttpServletRequest request, HttpServletResponse response) {
-
         response.setHeader("Pragma", "No-cache");
         response.setHeader("Cache-Control", "no-cache");
         response.setDateHeader("Expires", 0);
         response.setContentType("image/jpeg");
 
-        //生成随机字串  
+        //生成随机字串
         String verifyCode = VerifyCodeUtils.generateVerifyCode(4);
-        //存入会话session  
+        //存入会话session
         HttpSession session = request.getSession(true);
         session.setAttribute("rand", verifyCode.toLowerCase());
-        //生成图片  
+        //生成图片
         int w = 200, h = 80;
         try {
             VerifyCodeUtils.outputImage(w, h, response.getOutputStream(), verifyCode);
@@ -47,8 +55,8 @@ public class AuthImageController extends BaseController {
         } catch (IOException e) {
             e.printStackTrace();
         }
-
         return new Result(false, "验证图片生成失败");
     }
 
+
 }

+ 0 - 21
src/main/java/com/izouma/awesomeadmin/web/BaseController.java

@@ -1,21 +0,0 @@
-package com.izouma.awesomeadmin.web;
-
-import java.beans.PropertyEditorSupport;
-import java.util.Date;
-
-import org.springframework.web.bind.WebDataBinder;
-import org.springframework.web.bind.annotation.InitBinder;
-
-public class BaseController {
-
-    @InitBinder
-    protected void initBinder(WebDataBinder binder) {
-        binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
-
-            @Override
-            public void setAsText(String value) {
-                setValue(new Date(Long.valueOf(value)));
-            }
-        });
-    }
-}

+ 1 - 2
src/main/java/com/izouma/awesomeadmin/web/CommonQueryController.java

@@ -4,7 +4,6 @@ import com.izouma.awesomeadmin.constant.AppConstant;
 import com.izouma.awesomeadmin.dto.Page;
 import com.izouma.awesomeadmin.dto.Result;
 import com.izouma.awesomeadmin.model.CommonQuery;
-import com.izouma.awesomeadmin.model.TestAaa;
 import com.izouma.awesomeadmin.service.CommonQueryService;
 import net.sf.json.JSONObject;
 import org.apache.shiro.authz.annotation.RequiresAuthentication;
@@ -24,7 +23,7 @@ import java.util.Map;
  */
 @Controller
 @RequestMapping("/commonQuery")
-public class CommonQueryController extends BaseController {
+public class CommonQueryController {
 
     @Autowired
     private CommonQueryService commonQueryService;

+ 1 - 2
src/main/java/com/izouma/awesomeadmin/web/DataSourceInfoController.java

@@ -3,7 +3,6 @@ package com.izouma.awesomeadmin.web;
 import java.util.*;
 
 import com.izouma.awesomeadmin.util.ExportExcelUtil;
-import org.apache.commons.lang.StringUtils;
 import org.apache.shiro.authz.annotation.RequiresAuthentication;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -22,7 +21,7 @@ import javax.servlet.http.HttpServletResponse;
 */
 @Controller
 @RequestMapping("/dataSourceInfo")
-public class DataSourceInfoController extends BaseController{
+public class DataSourceInfoController {
 
     @Autowired
     private DataSourceInfoService dataSourceInfoService;

+ 1 - 2
src/main/java/com/izouma/awesomeadmin/web/DepartInfoController.java

@@ -6,7 +6,6 @@ import java.util.Map;
 
 import com.izouma.awesomeadmin.dto.TreeNode;
 import com.izouma.awesomeadmin.model.UserInfo;
-import com.izouma.awesomeadmin.service.UserInfoService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -28,7 +27,7 @@ import javax.servlet.http.HttpServletRequest;
  */
 @Controller
 @RequestMapping("/departInfo")
-public class DepartInfoController extends BaseController {
+public class DepartInfoController {
 
     @Autowired
     private DepartInfoService departInfoService;

+ 1 - 1
src/main/java/com/izouma/awesomeadmin/web/DevelopController.java

@@ -19,7 +19,7 @@ import java.util.Map;
 
 @Controller
 @RequestMapping("/dev")
-public class DevelopController extends BaseController {
+public class DevelopController {
     @Autowired
     private RequestMappingHandlerMapping requestMappingHandlerMapping;
 

+ 1 - 2
src/main/java/com/izouma/awesomeadmin/web/GenCodeController.java

@@ -2,7 +2,6 @@ package com.izouma.awesomeadmin.web;
 
 import java.io.File;
 import java.util.*;
-import java.util.regex.Pattern;
 
 import com.google.gson.Gson;
 import com.izouma.awesomeadmin.model.DataSourceInfo;
@@ -30,7 +29,7 @@ import org.springframework.web.context.ContextLoader;
  */
 @Controller
 @RequestMapping("/genCode")
-public class GenCodeController extends BaseController {
+public class GenCodeController {
 
     @Autowired
     private GenCodeService genCodeService;

+ 1 - 1
src/main/java/com/izouma/awesomeadmin/web/GenTestTableController.java

@@ -23,7 +23,7 @@ import com.izouma.awesomeadmin.service.GenTestTableService;
  */ 
 @Controller
 @RequestMapping("/genTestTable")
-public class GenTestTableController extends BaseController  {
+public class GenTestTableController {
 
 	@Autowired
 	private GenTestTableService genTestTableService;

+ 1 - 1
src/main/java/com/izouma/awesomeadmin/web/MsgSenderController.java

@@ -21,7 +21,7 @@ import com.izouma.awesomeadmin.util.MsgUtil;
  */
 @Controller
 @RequestMapping("/msg")
-public class MsgSenderController extends BaseController {
+public class MsgSenderController {
 
     @RequestMapping(value = "/sendCodeMsg", method = RequestMethod.GET)
     @ResponseBody

+ 1 - 1
src/main/java/com/izouma/awesomeadmin/web/PowerInfoController.java

@@ -22,7 +22,7 @@ import java.util.Map;
  */
 @Controller
 @RequestMapping("/powerInfo")
-public class PowerInfoController extends BaseController {
+public class PowerInfoController {
 
     @Autowired
     private PowerInfoService powerInfoService;

+ 1 - 2
src/main/java/com/izouma/awesomeadmin/web/QueryConfigController.java

@@ -4,7 +4,6 @@ import java.util.*;
 
 import com.google.gson.Gson;
 import com.izouma.awesomeadmin.util.ExportExcelUtil;
-import org.apache.commons.lang.StringUtils;
 import org.apache.shiro.authz.annotation.RequiresAuthentication;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -23,7 +22,7 @@ import javax.servlet.http.HttpServletResponse;
  */
 @Controller
 @RequestMapping("/queryConfig")
-public class QueryConfigController extends BaseController {
+public class QueryConfigController {
 
     @Autowired
     private QueryConfigService queryConfigService;

+ 1 - 1
src/main/java/com/izouma/awesomeadmin/web/RongCloudController.java

@@ -19,7 +19,7 @@ import javax.servlet.http.HttpServletRequest;
 
 @Controller
 @RequestMapping("/rong")
-public class RongCloudController extends BaseController {
+public class RongCloudController {
 
     @Autowired
     private RongYunTokenService rongYunTokenService;

+ 1 - 1
src/main/java/com/izouma/awesomeadmin/web/SysDataruleController.java

@@ -23,7 +23,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
  */ 
 @Controller
 @RequestMapping("/sysDatarule")
-public class SysDataruleController extends BaseController {
+public class SysDataruleController {
 
 	@Autowired
 	private SysDataruleService sysDataruleService;

+ 1 - 2
src/main/java/com/izouma/awesomeadmin/web/SysMenuController.java

@@ -3,7 +3,6 @@ package com.izouma.awesomeadmin.web;
 import com.izouma.awesomeadmin.constant.AppConstant;
 import com.izouma.awesomeadmin.dto.Page;
 import com.izouma.awesomeadmin.dto.Result;
-import com.izouma.awesomeadmin.dto.TreeNode;
 import com.izouma.awesomeadmin.model.SysMenu;
 import com.izouma.awesomeadmin.service.SysMenuService;
 import org.apache.shiro.authz.annotation.RequiresAuthentication;
@@ -25,7 +24,7 @@ import java.util.Map;
 @Controller
 @RequestMapping("/sysMenu")
 @RequiresAuthentication
-public class SysMenuController extends BaseController {
+public class SysMenuController {
 
     @Autowired
     private SysMenuService sysMenuService;

+ 1 - 1
src/main/java/com/izouma/awesomeadmin/web/SysRoleController.java

@@ -23,7 +23,7 @@ import java.util.Map;
  */ 
 @Controller
 @RequestMapping("/sysRole")
-public class SysRoleController extends BaseController  {
+public class SysRoleController {
 
 	@Autowired
 	private SysRoleService sysRoleService;

+ 1 - 1
src/main/java/com/izouma/awesomeadmin/web/TableFieldController.java

@@ -23,7 +23,7 @@ import com.izouma.awesomeadmin.service.TableFieldService;
  */ 
 @Controller
 @RequestMapping("/tableField")
-public class TableFieldController extends BaseController  {
+public class TableFieldController {
 
 	@Autowired
 	private TableFieldService tableFieldService;

+ 1 - 2
src/main/java/com/izouma/awesomeadmin/web/TableShouyiYaopinxinxiController.java

@@ -3,7 +3,6 @@ package com.izouma.awesomeadmin.web;
 import java.util.*;
 
 import com.izouma.awesomeadmin.util.ExportExcelUtil;
-import org.apache.commons.lang.StringUtils;
 import org.apache.shiro.authz.annotation.RequiresAuthentication;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -22,7 +21,7 @@ import javax.servlet.http.HttpServletResponse;
 */
 @Controller
 @RequestMapping("/tableShouyiYaopinxinxi")
-public class TableShouyiYaopinxinxiController extends BaseController{
+public class TableShouyiYaopinxinxiController {
 
     @Autowired
     private TableShouyiYaopinxinxiService tableShouyiYaopinxinxiService;

+ 1 - 2
src/main/java/com/izouma/awesomeadmin/web/TestAaaController.java

@@ -3,7 +3,6 @@ package com.izouma.awesomeadmin.web;
 import java.util.*;
 
 import com.izouma.awesomeadmin.util.ExportExcelUtil;
-import org.apache.commons.lang.StringUtils;
 import org.apache.shiro.authz.annotation.RequiresAuthentication;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -22,7 +21,7 @@ import javax.servlet.http.HttpServletResponse;
 */
 @Controller
 @RequestMapping("/testAaa")
-public class TestAaaController extends BaseController{
+public class TestAaaController {
 
     @Autowired
     private TestAaaService testAaaService;

+ 1 - 2
src/main/java/com/izouma/awesomeadmin/web/TestBbbController.java

@@ -3,7 +3,6 @@ package com.izouma.awesomeadmin.web;
 import java.util.*;
 
 import com.izouma.awesomeadmin.util.ExportExcelUtil;
-import org.apache.commons.lang.StringUtils;
 import org.apache.shiro.authz.annotation.RequiresAuthentication;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -22,7 +21,7 @@ import javax.servlet.http.HttpServletResponse;
 */
 @Controller
 @RequestMapping("/testBbb")
-public class TestBbbController extends BaseController{
+public class TestBbbController {
 
     @Autowired
     private TestBbbService testBbbService;

+ 1 - 2
src/main/java/com/izouma/awesomeadmin/web/TestBbbCopyController.java

@@ -3,7 +3,6 @@ package com.izouma.awesomeadmin.web;
 import java.util.*;
 
 import com.izouma.awesomeadmin.util.ExportExcelUtil;
-import org.apache.commons.lang.StringUtils;
 import org.apache.shiro.authz.annotation.RequiresAuthentication;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -22,7 +21,7 @@ import javax.servlet.http.HttpServletResponse;
 */
 @Controller
 @RequestMapping("/testBbbCopy")
-public class TestBbbCopyController extends BaseController{
+public class TestBbbCopyController {
 
     @Autowired
     private TestBbbCopyService testBbbCopyService;

+ 1 - 2
src/main/java/com/izouma/awesomeadmin/web/TestCaidanController.java

@@ -3,7 +3,6 @@ package com.izouma.awesomeadmin.web;
 import java.util.*;
 
 import com.izouma.awesomeadmin.util.ExportExcelUtil;
-import org.apache.commons.lang.StringUtils;
 import org.apache.shiro.authz.annotation.RequiresAuthentication;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -22,7 +21,7 @@ import javax.servlet.http.HttpServletResponse;
 */
 @Controller
 @RequestMapping("/testCaidan")
-public class TestCaidanController extends BaseController{
+public class TestCaidanController {
 
     @Autowired
     private TestCaidanService testCaidanService;

+ 1 - 2
src/main/java/com/izouma/awesomeadmin/web/TestDeployController.java

@@ -3,7 +3,6 @@ package com.izouma.awesomeadmin.web;
 import java.util.*;
 
 import com.izouma.awesomeadmin.util.ExportExcelUtil;
-import org.apache.commons.lang.StringUtils;
 import org.apache.shiro.authz.annotation.RequiresAuthentication;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -22,7 +21,7 @@ import javax.servlet.http.HttpServletResponse;
 */
 @Controller
 @RequestMapping("/testDeploy")
-public class TestDeployController extends BaseController{
+public class TestDeployController {
 
     @Autowired
     private TestDeployService testDeployService;

+ 1 - 2
src/main/java/com/izouma/awesomeadmin/web/TestSqlserverAaaController.java

@@ -3,7 +3,6 @@ package com.izouma.awesomeadmin.web;
 import java.util.*;
 
 import com.izouma.awesomeadmin.util.ExportExcelUtil;
-import org.apache.commons.lang.StringUtils;
 import org.apache.shiro.authz.annotation.RequiresAuthentication;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -22,7 +21,7 @@ import javax.servlet.http.HttpServletResponse;
 */
 @Controller
 @RequestMapping("/testSqlserverAaa")
-public class TestSqlserverAaaController extends BaseController{
+public class TestSqlserverAaaController {
 
     @Autowired
     private TestSqlserverAaaService testSqlserverAaaService;

+ 1 - 2
src/main/java/com/izouma/awesomeadmin/web/TestaaaoneController.java

@@ -3,7 +3,6 @@ package com.izouma.awesomeadmin.web;
 import java.util.*;
 
 import com.izouma.awesomeadmin.util.ExportExcelUtil;
-import org.apache.commons.lang.StringUtils;
 import org.apache.shiro.authz.annotation.RequiresAuthentication;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -22,7 +21,7 @@ import javax.servlet.http.HttpServletResponse;
 */
 @Controller
 @RequestMapping("/testaaaone")
-public class TestaaaoneController extends BaseController{
+public class TestaaaoneController {
 
     @Autowired
     private TestaaaoneService testaaaoneService;

+ 1 - 2
src/main/java/com/izouma/awesomeadmin/web/TestgitController.java

@@ -3,7 +3,6 @@ package com.izouma.awesomeadmin.web;
 import java.util.*;
 
 import com.izouma.awesomeadmin.util.ExportExcelUtil;
-import org.apache.commons.lang.StringUtils;
 import org.apache.shiro.authz.annotation.RequiresAuthentication;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -22,7 +21,7 @@ import javax.servlet.http.HttpServletResponse;
 */
 @Controller
 @RequestMapping("/testgit")
-public class TestgitController extends BaseController{
+public class TestgitController {
 
     @Autowired
     private TestgitService testgitService;

+ 1 - 1
src/main/java/com/izouma/awesomeadmin/web/UserInfoController.java

@@ -43,7 +43,7 @@ import javax.servlet.http.HttpSession;
  */
 @Controller
 @RequestMapping("/userInfo")
-public class UserInfoController extends BaseController {
+public class UserInfoController {
 
     @Autowired
     private UserInfoService userInfoService;

+ 1 - 7
src/main/java/com/izouma/awesomeadmin/web/activiti/ModelController.java

@@ -3,7 +3,6 @@ package com.izouma.awesomeadmin.web.activiti;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.izouma.awesomeadmin.dto.Result;
-import com.izouma.awesomeadmin.web.BaseController;
 import org.activiti.bpmn.converter.BpmnXMLConverter;
 import org.activiti.bpmn.model.BpmnModel;
 import org.activiti.editor.constants.ModelDataJsonConstants;
@@ -13,7 +12,6 @@ import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
 import org.activiti.engine.repository.Deployment;
 import org.activiti.engine.repository.Model;
 import org.activiti.engine.repository.ModelQuery;
-import org.activiti.engine.runtime.ProcessInstance;
 import org.apache.commons.lang.StringUtils;
 import org.apache.shiro.authz.annotation.RequiresAuthentication;
 import org.apache.shiro.authz.annotation.RequiresRoles;
@@ -21,17 +19,13 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletRequest;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
 
 @Controller
 @RequestMapping("/activiti/model")
 @RequiresAuthentication
 @RequiresRoles("admin")
-public class ModelController extends BaseController {
+public class ModelController {
     @Autowired
     private IdentityService                identityService;
     @Autowired

+ 1 - 6
src/main/java/com/izouma/awesomeadmin/web/activiti/ProcessController.java

@@ -2,27 +2,22 @@ package com.izouma.awesomeadmin.web.activiti;
 
 import com.izouma.awesomeadmin.dto.Result;
 import com.izouma.awesomeadmin.model.UserInfo;
-import com.izouma.awesomeadmin.web.BaseController;
 import org.activiti.engine.*;
 import org.activiti.engine.history.HistoricProcessInstanceQuery;
 import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
 import org.activiti.engine.runtime.ProcessInstance;
-import org.apache.commons.lang.StringUtils;
 import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.authz.annotation.RequiresAuthentication;
-import org.apache.shiro.authz.annotation.RequiresPermissions;
-import org.apache.shiro.authz.annotation.RequiresRoles;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletRequest;
 import java.util.*;
 
 @Controller
 @RequestMapping("/activiti/process")
 @RequiresAuthentication
-public class ProcessController extends BaseController {
+public class ProcessController {
     @Autowired
     private IdentityService                identityService;
     @Autowired

+ 1 - 1
src/main/resources/properties/log4j.properties

@@ -16,7 +16,7 @@ log4j.logger.test.com.izouma=DEBUG
 
 #spring
 log4j.logger.org.springframework=ERROR
-log4j.logger.org.springframework.jdbc.core=DEBUG
+log4j.logger.org.springframework.jdbc.core=ERROR
 
 #mybatis
 log4j.logger.org.mybatis=ERROR

+ 1 - 0
src/main/resources/properties/outsidews.properties

@@ -8,4 +8,5 @@ alibucketname=microball
 aliImageSever=http://oss.izouma.com
 rongyunappkey=pwe86ga5ee376
 rongyunappsecret=ARj0hyU5Cp
+jwtsecret=3MgWy/pJjxHCQW2pHlQbkjomTUPRo9WhsPFjUPYZZlo=
 redirecturi=http://aosmith.tunnel.2bdata.com/wx/Login

+ 10 - 11
src/main/resources/spring/appDataSource.xml

@@ -17,7 +17,7 @@
         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd"
        default-lazy-init="true">
 
-    <context:component-scan base-package="com.izouma.awesomeadmin.datasource" />
+    <context:component-scan base-package="com.izouma.awesomeadmin.datasource"/>
 
     <!-- 配置整合mybatis过程 -->
     <!-- 1:配置数据库相关参数 properties 的属性 : ${url} -->
@@ -39,7 +39,7 @@
         <!-- 获取连接超时时间 -->
         <property name="checkoutTimeout" value="10000"/>
 
-        <property name="idleConnectionTestPeriod" value="60" />
+        <property name="idleConnectionTestPeriod" value="60"/>
         <!-- 当获取链接失败重试次数 -->
         <property name="acquireRetryAttempts" value="2"/>
 
@@ -55,18 +55,18 @@
         </property>
         <!-- 这里可以指定默认的数据源 -->
         <property name="defaultTargetDataSource" ref="dataSource"/>
-        <property name="masterDataSource"  ref="dataSource"/>
+        <property name="masterDataSource" ref="dataSource"/>
     </bean>
 
 
     <!--<bean id="dataSourceAspect" class="com.izouma.awesomeadmindatasource.DataSourceAspect"></bean>-->
-        <!--<aop:config>-->
-            <!--<aop:aspect ref="dataSourceAspect">-->
-                <!--&lt;!&ndash; 拦截所有service方法 &ndash;&gt;-->
-                <!--<aop:pointcut id="dataSourcePointcut" expression="execution(* com.izouma..*(..))"/>-->
-                <!--<aop:before pointcut-ref="dataSourcePointcut" method="intercept"/>-->
-            <!--</aop:aspect>-->
-        <!--</aop:config>-->
+    <!--<aop:config>-->
+    <!--<aop:aspect ref="dataSourceAspect">-->
+    <!--&lt;!&ndash; 拦截所有service方法 &ndash;&gt;-->
+    <!--<aop:pointcut id="dataSourcePointcut" expression="execution(* com.izouma..*(..))"/>-->
+    <!--<aop:before pointcut-ref="dataSourcePointcut" method="intercept"/>-->
+    <!--</aop:aspect>-->
+    <!--</aop:config>-->
 
     <!--开启aop注解模式-->
     <aop:aspectj-autoproxy/>
@@ -95,5 +95,4 @@
     </bean>
 
 
-
 </beans>

+ 18 - 10
src/main/resources/spring/beans-shiro.xml

@@ -1,20 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:util="http://www.springframework.org/schema/util"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans
+       http://www.springframework.org/schema/beans/spring-beans.xsd
+       http://www.springframework.org/schema/util
+       http://www.springframework.org/schema/util/spring-util.xsd">
+
     <!-- 配置一个shiro框架的过滤器工厂bean,用于创建shiro框架的过滤器 -->
     <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
         <property name="securityManager" ref="securityManager"/>
-        <property name="filters">
-            <util:map>
-                <entry key="shiroCrossFilter" value-ref="shiroCrossFilter"/>
-            </util:map>
-        </property>
-        <property name="loginUrl" value="/#/login"/>
-        <property name="unauthorizedUrl" value="/unauthorized.jsp"/>
     </bean>
 
-    <bean id="shiroCrossFilter" class="com.izouma.awesomeadmin.shiro.ShiroCrossFilter"/>
+    <bean id="appTokenAuthFilter" class="com.izouma.awesomeadmin.shiro.AppTokenFilter"/>
 
     <!-- 注册安全管理器 -->
     <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
@@ -24,8 +22,10 @@
             <list>
                 <ref bean="phoneCodeRealm"/>
                 <ref bean="userPasswordRealm"/>
+                <ref bean="appTokenRealm"/>
             </list>
         </property>
+        <!--<property name="subjectFactory" ref="agileSubjectFactory"/>-->
     </bean>
 
     <bean id="modularRealmAuthenticator" class="com.izouma.awesomeadmin.shiro.MyModularRealmAuthenticator">
@@ -37,6 +37,7 @@
             <list>
                 <ref bean="phoneCodeRealm"/>
                 <ref bean="userPasswordRealm"/>
+                <ref bean="appTokenRealm"/>
             </list>
         </property>
     </bean>
@@ -48,4 +49,11 @@
     <bean id="userPasswordRealm" class="com.izouma.awesomeadmin.shiro.UserPasswordRealm">
         <property name="authenticationTokenClass" value="org.apache.shiro.authc.UsernamePasswordToken"/>
     </bean>
+    <bean id="appTokenRealm" class="com.izouma.awesomeadmin.shiro.AppTokenRealm">
+        <property name="authenticationTokenClass" value="com.izouma.awesomeadmin.shiro.AppToken"/>
+    </bean>
+
+    <bean id="agileSubjectFactory" class="com.izouma.awesomeadmin.shiro.AgileSubjectFactory"/>
+
+    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
 </beans>

+ 21 - 8
src/main/resources/spring/spring-mvc.xml

@@ -59,7 +59,14 @@
             </list>
         </property>
     </bean>
-
+    <mvc:annotation-driven conversion-service="conversionService"/>
+    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
+        <property name="converters">
+            <list>
+                <bean class="com.izouma.awesomeadmin.container.DateConverter"/>
+            </list>
+        </property>
+    </bean>
 
     <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
         <property name="defaultEncoding" value="utf-8"/>
@@ -74,7 +81,13 @@
     </bean>
 
     <!-- 配置shiro框架的切面类 -->
-    <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"/>
+    <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
+          depends-on="lifecycleBeanPostProcessor">
+        <property name="proxyTargetClass" value="true"/>
+    </bean>
+    <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
+        <property name="securityManager" ref="securityManager"/>
+    </bean>
     <bean id="exceptionResolver" class="com.izouma.awesomeadmin.shiro.MyExceptionResolver"/>
 
     <!-- dwz静态资源管理  -->
@@ -84,11 +97,11 @@
 
     <mvc:resources mapping="/static/**" location="/static/" cache-period="0"/>
 
-    <!--<mvc:interceptors>-->
-    <!--<mvc:interceptor>-->
-    <!--<mvc:mapping javaPath="/**/*"/>-->
-    <!--<bean class="com.izouma.awesomeadmininterceptor.CrossInterceptor" />-->
-    <!--</mvc:interceptor>-->
-    <!--</mvc:interceptors>-->
+    <mvc:interceptors>
+        <mvc:interceptor>
+            <mvc:mapping path="/**/*"/>
+            <bean class="com.izouma.awesomeadmin.interceptor.GlobalInterceptor"/>
+        </mvc:interceptor>
+    </mvc:interceptors>
 
 </beans>

+ 1 - 1
src/main/resources/templates/ControllerTemplate.vm

@@ -25,7 +25,7 @@ import javax.servlet.http.HttpServletResponse;
 */
 @Controller
 @RequestMapping("/$display.uncapitalize($model.className)")
-public class ${model.className}Controller extends BaseController{
+public class ${model.className}Controller {
 
     @Autowired
     private ${model.className}Service $display.uncapitalize(${model.className})Service;

+ 5 - 9
src/main/webapp/WEB-INF/web.xml

@@ -14,7 +14,7 @@
 
     <display-name>awesome-admin</display-name>
     <welcome-file-list>
-        <welcome-file>index.html</welcome-file>
+        <welcome-file>admin</welcome-file>
     </welcome-file-list>
     <context-param>
         <param-name>log4jConfigLocation</param-name>
@@ -100,19 +100,15 @@
         <servlet-name>RestServlet</servlet-name>
         <url-pattern>/rest/*</url-pattern>
     </servlet-mapping>
-    <filter>
-        <filter-name>cors</filter-name>
-        <filter-class>com.izouma.awesomeadmin.interceptor.CrossFilter</filter-class>
-    </filter>
-    <filter-mapping>
-        <filter-name>cors</filter-name>
-        <url-pattern>/*</url-pattern>
-    </filter-mapping>
 
     <!-- 配置spring提供的用于整合shiro框架的过滤器 -->
     <filter>
         <filter-name>shiroFilter</filter-name>
         <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
+        <init-param>
+            <param-name>targetFilterLifecycle</param-name>
+            <param-value>true</param-value>
+        </init-param>
     </filter>
     <filter-mapping>
         <filter-name>shiroFilter</filter-name>

+ 56 - 0
src/test/java/AppTokenTest.java

@@ -0,0 +1,56 @@
+import com.izouma.awesomeadmin.util.PropertiesFileLoader;
+import io.jsonwebtoken.*;
+import io.jsonwebtoken.security.Keys;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.support.GenericXmlContextLoader;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.crypto.SecretKey;
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+import java.util.Date;
+import java.util.UUID;
+
+@RunWith(value = SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {"classpath:/spring/applicationContext.xml"}, loader = GenericXmlContextLoader.class)
+@Transactional
+public class AppTokenTest {
+    @Test
+    public void genKey() {
+        SecretKey key = Keys.hmacShaKeyFor(Base64.getDecoder().decode(PropertiesFileLoader.getProperties("jwtsecret").getBytes()));
+
+        System.out.println(new String(Base64.getEncoder().encode(key.getEncoded())));
+    }
+
+    @Test
+    public void genToken() {
+        SecretKey key = Keys.hmacShaKeyFor(Base64.getDecoder().decode(PropertiesFileLoader.getProperties("jwtsecret").getBytes()));
+
+        long currentTimeMillis = System.currentTimeMillis();// 当前时间戳
+        JwtBuilder jwt = Jwts.builder();
+        jwt.setId(UUID.randomUUID().toString())
+                .setIssuer("admin")
+                .setIssuedAt(new Date(currentTimeMillis))
+                .setSubject("84664")
+//                .setExpiration()
+                .signWith(key);
+        System.out.println(jwt.compact());
+    }
+
+    @Test
+    public void parseToken() {
+        SecretKey key = Keys.hmacShaKeyFor(Base64.getDecoder().decode(PropertiesFileLoader.getProperties("jwtsecret").getBytes()));
+        Jwt jwt = Jwts.parser()
+                .setSigningKey(key)
+                .parse("eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxMDZjNzU5OS1kNmRhLTQ5ODUtOWQ5MS0" +
+                        "4ZGZmOWY3MzAwNWMiLCJpc3MiOiJhZG1pbiIsImlhdCI6MTUzMzYzNTQyNSwic3ViI" +
+                        "joiODQ2NjQifQ.tqKdEXle3S29Ruaj_9EPpfi7NMvM1_I05eUuGTi1fUU");
+        Claims claims = (Claims) jwt.getBody();
+
+        System.out.println(jwt);
+    }
+
+}