程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

springboot集成shiro+jwt详解+完整实例

发布于2021-05-29 22:07     阅读(935)     评论(0)     点赞(13)     收藏(3)


目录

简介

目的

需要的jar

集成过程

1.配置shiro

2.创建自定义Realm

2.1 LoginRealm用于处理用户登录

2.2  JwtRealm用于在登录之后,用户的token是否正确以及给当前用户授权等

2.3 OurModularRealmAuthenticator用于匹配的相应的Realm

2.4 DataAutoToken及实现类

2.5 JwtFilter处理在shiro配置的自定义的Filter

2.6 controller层登录和其他接口

2.7 service层

2.8 jwt工具类

2.9 其他的一些工具类

2.10 返回结果定义


简介

现在主流的安全框架分别为Shiro和Spring Security。关于两者之间的优缺点不是本文的重点,有兴趣的可以在网上搜搜,各种文章也都分析的很清楚。那么简单来说,Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能。(不一定要建立所谓的五张表,我们要做到控制自如的使用

目的

通过集成shiro,jwt我们要实现:用户登录的校验;登录成功后返回成功并携带具有身份信息的token以便后续调用接口的时候做认证;对项目的接口进行权限的限定等。

需要的jar

本文使用的gradel作为jar包管理工具,maven也是使用相同的jar

  1. //shiro的jar
  2. implementation 'org.apache.shiro:shiro-spring:1.7.1'
  3. //jwt的jar
  4. implementation 'com.auth0:java-jwt:3.15.0'
  5. implementation 'com.alibaba:fastjson:1.2.76'
  6. compileOnly 'org.projectlombok:lombok'
  7. annotationProcessor 'org.projectlombok:lombok'

集成过程

1.配置shiro

  1. @Configuration
  2. public class ShiroConfig {
  3. /*
  4. * 解决spring aop和注解配置一起使用的bug。如果您在使用shiro注解配置的同时,引入了spring
  5. * aop的starter,会有一个奇怪的问题,导致shiro注解的请求,不能被映射
  6. */
  7. @Bean
  8. public static DefaultAdvisorAutoProxyCreator creator() {
  9. DefaultAdvisorAutoProxyCreator creator = new DefaultAdvisorAutoProxyCreator();
  10. creator.setProxyTargetClass(true);
  11. return creator;
  12. }
  13. /**
  14. * Enable Shiro AOP annotation support. --<1>
  15. *
  16. * @param securityManager Security Manager
  17. * @return AuthorizationAttributeSourceAdvisor
  18. */
  19. @Bean
  20. public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
  21. AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
  22. authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
  23. return authorizationAttributeSourceAdvisor;
  24. }
  25. /**
  26. * Use for login password matcher --<2>
  27. *
  28. * @return HashedCredentialsMatcher
  29. */
  30. @Bean("hashedCredentialsMatcher")
  31. public HashedCredentialsMatcher hashedCredentialsMatcher() {
  32. HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
  33. // set name of hash
  34. matcher.setHashAlgorithmName("SHA-256");
  35. // Storage format is hexadecimal
  36. matcher.setStoredCredentialsHexEncoded(true);
  37. return matcher;
  38. }
  39. /**
  40. * Realm for login --<3>
  41. *
  42. * @param matcher password matcher
  43. * @return PasswordRealm
  44. */
  45. @Bean
  46. public LoginRealm loginRealm(@Qualifier("hashedCredentialsMatcher") HashedCredentialsMatcher matcher) {
  47. LoginRealm loginRealm = new LoginRealm(LOGIN);
  48. loginRealm.setCredentialsMatcher(matcher);
  49. return loginRealm;
  50. }
  51. /**
  52. * JwtReal, use for token validation --<4>
  53. *
  54. * @return JwtRealm
  55. */
  56. @Bean
  57. public JwtRealm jwtRealm() {
  58. return new JwtRealm(JWT);
  59. }
  60. // --<5>
  61. @Bean
  62. public OurModularRealmAuthenticator userModularRealmAuthenticator() {
  63. // rewrite ModularRealmAuthenticator
  64. DataAuthModularRealmAuthenticator modularRealmAuthenticator = new DataAuthModularRealmAuthenticator();
  65. modularRealmAuthenticator.setAuthenticationStrategy(new AtLeastOneSuccessfulStrategy());
  66. return modularRealmAuthenticator;
  67. }
  68. // --<6>
  69. @Bean(name = "securityManager")
  70. public SecurityManager securityManager(
  71. @Qualifier("userModularRealmAuthenticator") OurModularRealmAuthenticatormodular,
  72. @Qualifier("jwtRealm") JwtRealm jwtRealm,
  73. @Qualifier("loginRealm") LoginRealm loginRealm
  74. ) {
  75. DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
  76. // set realm
  77. manager.setAuthenticator(modular);
  78. // set to use own realm
  79. List<Realm> realms = new ArrayList<>();
  80. realms.add(loginRealm);
  81. realms.add(jwtRealm);
  82. manager.setRealms(realms);
  83. // close Shiro's built-in session
  84. DefaultSubjectDAO subjectDAO = new DefaultSubjectDAO();
  85. DefaultSessionStorageEvaluator defaultSessionStorageEvaluator = new DefaultSessionStorageEvaluator();
  86. defaultSessionStorageEvaluator.setSessionStorageEnabled(false);
  87. subjectDAO.setSessionStorageEvaluator(defaultSessionStorageEvaluator);
  88. manager.setSubjectDAO(subjectDAO);
  89. return manager;
  90. }
  91. // --<7>
  92. @Bean(name = "shiroFilter")
  93. public ShiroFilterFactoryBean shiroFilter(@Qualifier("securityManager") SecurityManager securityManager) {
  94. ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
  95. shiroFilterFactoryBean.setSecurityManager(securityManager);
  96. Map<String, Filter> filter = new LinkedHashMap<>(1);
  97. filter.put("jwt", new JwtFilter());
  98. shiroFilterFactoryBean.setFilters(filter);
  99. Map<String, String> filterMap = new HashMap<>();
  100. filterMap.put("/login/**", "anon");
  101. filterMap.put("/v1/**", "jwt");
  102. shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
  103. return shiroFilterFactoryBean;
  104. }
  105. }
  1. 开启shiro注解支持,具体原理请参考shiro中AuthorizationAttributeSourceAdvisor作用

  2. 配置shiro登录验证的密码加密方式:Shiro 提供了用于加密密码验证密码服务的 CredentialsMatcher 接口,HashedCredentialsMatcher 正是 CredentialsMatcher 的一个实现类。

  3. LoginRealm:自定义的Realm,用于处理用户登录验证的Realm,在shiro中验证及授权等信息会在Realm中配置,详细解释请参考shiro简介

  4. JwtRealm:自定义的Realm,用户在登录后访问服务时做token的校验,用户权限的校验等。

  5. 配置DataAuthModularRealmAuthenticator:是在项目中存在多个Realm时,根据项目的认证策略可以选择匹配需要的Realm。

  6. SecurityManager:Shiro的核心组件,管理着认证、授权、会话管理等,在这里我把所有的自定义的Realm等资源加入到SecurityManager中

  7. Shiro的过滤器:定制项目的path过滤规则,并将我们自定义的Filter加入到Shiro中的shiroFilterFactoryBean中

2.创建自定义Realm

2.1 LoginRealm用于处理用户登录

  1. public class LoginRealm extends AuthorizingRealm {
  2. public LoginRealm(String name) {
  3. setName(name);
  4. }
  5. // 获取user相关信息的service类
  6. @Autowired
  7. private UserLoginService userLoginService;
  8. // supports方法必须重写,这是shiro处理流程中的一部分,他会通过此方法判断realm是否匹配的正确
  9. @Override
  10. public boolean supports(AuthenticationToken token) {
  11. return token instanceof LoginDataAutoToken;
  12. }
  13. @Override
  14. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
  15. return null;
  16. }
  17. @Override
  18. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken auth) throws AuthenticationException {
  19. LoginDataAutoToken token = (LoginDataAutoToken) auth;
  20. serviceLog.info(token.getUsername() + "password auth start...");
  21. User user = userLoginService.selectUserByName(token.getUsername());
  22. if (user == null) throw new UnknownAccountException();
  23. Object credentials = user.getPassword();
  24. // save username and role to Attribute
  25. ServletUtils.userNameRoleTo.accept(user.getUserName(), (int) user.getUserType());
  26. return new SimpleAuthenticationInfo(user, credentials, super.getName());
  27. }
  28. }

2.2  JwtRealm用于在登录之后,用户的token是否正确以及给当前用户授权等

  1. public class JwtRealm extends AuthorizingRealm {
  2. public JwtRealm(String name) {
  3. setName(name);
  4. }
  5. @Override
  6. public boolean supports(AuthenticationToken token) {
  7. return token instanceof JwtDataAutoToken;
  8. }
  9. // 给当前用户授权,只有在访问的接口上配置了shiro的权限相关的注解的时候才会进入此方法
  10. @Override
  11. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
  12. SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
  13. UserEnum.Type userEnum = EnumValue.dataValueOf(
  14. UserEnum.Type.class,
  15. ServletUtils.userNameRoleFrom.get().getUserRole()
  16. );
  17. Set<String> roles = new HashSet<>();
  18. roles.add(userEnum.getDesc());
  19. // 授权角色如果有其他的权限则都已此类的方式授权
  20. authorizationInfo.setRoles(roles);
  21. return authorizationInfo;
  22. }
  23. // 验证此次request携带的token是否正确,如果正确解析当前token,并存入上下文中
  24. @Override
  25. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken auth) throws AuthenticationException {
  26. // verify token
  27. String token = (String) auth.getCredentials();
  28. TokenUtils.verify(token);
  29. TupleNameRole tupleNameRole = TokenUtils.tokenDecode(token);
  30. ServletUtils.userNameRoleTo.accept(tupleNameRole.getUsername(), tupleNameRole.getUserRole());
  31. return new SimpleAuthenticationInfo(token, token, ((JwtDataAutoToken) auth).getName());
  32. }
  33. }

2.3 OurModularRealmAuthenticator用于匹配的相应的Realm

  1. public class DataAuthModularRealmAuthenticator extends ModularRealmAuthenticator {
  2. @Override
  3. protected AuthenticationInfo doAuthenticate(AuthenticationToken authenticationToken) throws AuthenticationException {
  4. assertRealmsConfigured();
  5. DataAutoToken dataAutoToken = (DataAutoToken) authenticationToken;
  6. Realm realm = getRealm(dataAutoToken);
  7. return doSingleRealmAuthentication(realm, authenticationToken);
  8. }
  9. private Realm getRealm(DataAutoToken dataAutoToken) {
  10. for (Realm realm : getRealms()) {
  11. // 根据定义的realm的name和dataAutoToken的name匹配相应的realm
  12. if (realm.getName().contains(dataAutoToken.getName())) {
  13. return realm;
  14. }
  15. }
  16. return null;
  17. }
  18. }

2.4 DataAutoToken及实现类

DataAuthModularRealmAuthenticator的doSingleRealmAuthentication(realm, authenticationToken)做检验的时候需要两个参数,一个是Realm另一个是我们定义的储存验证信息的AuthenticationToken或者它的实现类。

DataAutoToken:

  1. public interface DataAutoToken {
  2. String getName();
  3. }

 LoginDataAutoToken :

  1. public class LoginDataAutoToken extends UsernamePasswordToken implements DataAuthToken {
  2. public LoginDataAuthToken(final String username, final String password) {
  3. super(username, password);
  4. }
  5. @Override
  6. public String getName() {
  7. return LOGIN;
  8. }
  9. }

 JwtDataAutoToken:

  1. public class JwtDataAutoToken implements AuthenticationToken, DataAuthToken {
  2. private final String token;
  3. public JwtDataAuthToken(String token) {
  4. this.token = token;
  5. }
  6. @Override
  7. public Object getPrincipal() {
  8. return token;
  9. }
  10. @Override
  11. public Object getCredentials() {
  12. return token;
  13. }
  14. @Override
  15. public String getName() {
  16. return JWT;
  17. }
  18. }

2.5 JwtFilter处理在shiro配置的自定义的Filter

此类用于处理不在登录下必须携带发行的Token访问接口,如果Token存在,则使用shiro subject做token的和访问权限的校验。

  1. public class JwtFilter extends BasicHttpAuthenticationFilter {
  2. private final BiConsumer<ServletResponse, ErrorMessage> writeResponse = (response, message) ->
  3. Utils.renderString.accept(
  4. (HttpServletResponse) response,
  5. JSON.toJSONString(ResponseResult.fail(message), SerializerFeature.WriteMapNullValue)
  6. );
  7. /**
  8. * @param request ServletRequest
  9. * @param response ServletResponse
  10. * @param mappedValue mappedValue
  11. * @return 是否成功
  12. */
  13. @Override
  14. protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
  15. HttpServletRequest httpServletRequest = (HttpServletRequest) request;
  16. //input request to request log file
  17. requestLog.info(
  18. "path:{}, method:{}",
  19. httpServletRequest.getServletPath(),
  20. httpServletRequest.getMethod()
  21. );
  22. String token = httpServletRequest.getHeader(Constant.TOKEN);
  23. if (token != null) {
  24. return executeLogin(request, response);
  25. } else {
  26. writeResponse.accept(response, ErrorMessage.TOKEN_NOT_EXIST);
  27. return false;
  28. }
  29. }
  30. /**
  31. * execute login
  32. */
  33. @Override
  34. protected boolean executeLogin(ServletRequest request, ServletResponse response) {
  35. HttpServletRequest httpServletRequest = (HttpServletRequest) request;
  36. String token = httpServletRequest.getHeader(Constant.TOKEN);
  37. try {
  38. JwtDataAuthToken jwtToken = new JwtDataAuthToken(token);
  39. // validate user permission
  40. getSubject(request, response).login(jwtToken);
  41. return true;
  42. } catch (AuthenticationException e) {
  43. Throwable throwable = e.getCause();
  44. if (throwable instanceof TokenExpiredException) {
  45. writeResponse.accept(response, ErrorMessage.TOKEN_HAS_EXPIRED);
  46. } else {
  47. writeResponse.accept(response, ErrorMessage.TOKEN_INVALID);
  48. }
  49. }
  50. return false;
  51. }
  52. /**
  53. * support across domains
  54. */
  55. @Override
  56. protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {
  57. HttpServletRequest httpServletRequest = (HttpServletRequest) request;
  58. HttpServletResponse httpServletResponse = (HttpServletResponse) response;
  59. httpServletResponse.setHeader("Access-Control-Allow-Origin", httpServletRequest.getHeader("Origin"));
  60. httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS,PUT,DELETE");
  61. httpServletResponse.setHeader("Access-Control-Allow-Headers", httpServletRequest.getHeader("Access-Control-Request-Headers"));
  62. if (httpServletRequest.getMethod().equals(RequestMethod.OPTIONS.name())) {
  63. httpServletResponse.setStatus(HttpStatus.OK.value());
  64. return false;
  65. }
  66. return super.preHandle(request, response);
  67. }

2.6 controller层登录和其他接口

  1. @RestController
  2. public class AuthController {
  3. @Autowired
  4. private UserService userService;
  5. @PostMapping("/login")
  6. public ResponseResult<String> login(@RequestBody UserReqDto userReqDto) {
  7. userService.login(userLoginReqDto.getUsername(), userReqDto.getPassword());
  8. return ResponseResult.success();
  9. }
  10. // shiro角色注解,admin才可以访问此接口
  11. @RequiresRoles("admin")
  12. @PostMapping("/v1/user")
  13. public ResponseResult<String> addUser(@RequestBody UserAddReqDto userAddReqDto) {
  14. userService.add(userAddReqDto);
  15. return ResponseResult.success();
  16. }
  17. @PostMapping("/v1/token/verify")
  18. public ResponseResult<String> verify() {
  19. return ResponseResult.success(false);
  20. }
  21. @PostMapping("/v1/token/refresh")
  22. public ResponseResult<String> refresh() {
  23. return ResponseResult.success();
  24. }
  25. }

2.7 service层

  1. @Service
  2. public class UserServiceImpl implements UserService {
  3. @Override
  4. public void login(String username, String password) {
  5. // Use shiro to verify the username and password
  6. Subject subject = SecurityUtils.getSubject();
  7. LoginDataAutoToken token = new LoginDataAutoToken(username, password);
  8. subject.login(token);
  9. }
  10. @Transactional
  11. @Override
  12. public void add(UserAddReqDto dto) {
  13. User user = getUserByName.apply(dto.getUsername());
  14. if (user != null) {
  15. throw new DataAuthException(ErrorMessage.USER_ALREADY_EXISTS);
  16. } else {
  17. User newUser = new User();
  18. // 设置user的信息
  19. post(newUser); // insert user to database
  20. }
  21. }

2.8 jwt工具类

  1. public final class TokenUtils {
  2. private TokenUtils() {
  3. }
  4. /**
  5. * @param username username
  6. * @param role user role
  7. * @return The encrypted token
  8. */
  9. public static String createToken(String username, int role) {
  10. Date date = new Date(System.currentTimeMillis() + Constant.TOKEN_EXPIRE_TIME);
  11. Algorithm algorithm = Algorithm.HMAC256(username);
  12. return JWT.create()
  13. .withClaim(Constant.USER_NAME, username)
  14. .withClaim(Constant.USER_ROLE, role)
  15. .withExpiresAt(date)
  16. .sign(algorithm);
  17. }
  18. /**
  19. * @param username username
  20. * @param role user role
  21. * @return The encrypted token
  22. */
  23. public static String refreshToken(String username, int role) {
  24. return createToken(username, role);
  25. }
  26. /**
  27. * refresh token and add to header
  28. */
  29. public static void refreshToken() {
  30. TupleNameRole tupleNameRole = ServletUtils.userNameRoleFrom.get();
  31. ServletUtils.addHeader.accept(
  32. Constant.TOKEN,
  33. createToken(tupleNameRole.getUsername(), tupleNameRole.getUserRole())
  34. );
  35. }
  36. /**
  37. * verify token
  38. *
  39. * @param token jwtToken
  40. */
  41. public static void verify(String token) {
  42. try {
  43. TupleNameRole tupleNameRole = tokenDecode(token);
  44. Algorithm algorithm = Algorithm.HMAC256(tupleNameRole.getUsername());
  45. JWTVerifier verifier = JWT.require(algorithm)
  46. .withClaim(Constant.USER_NAME, tupleNameRole.getUsername())
  47. .withClaim(Constant.USER_ROLE, tupleNameRole.getUserRole())
  48. .build();
  49. verifier.verify(token);
  50. } catch (JWTVerificationException e) {
  51. serviceLog.error("token verify fail.", e);
  52. throw e;
  53. }
  54. }
  55. /**
  56. * @param token token
  57. * @return user name and role
  58. */
  59. public static TupleNameRole tokenDecode(String token) {
  60. try {
  61. DecodedJWT jwt = JWT.decode(token);
  62. return new TupleNameRole(
  63. jwt.getClaim(Constant.USER_NAME).asString(),
  64. jwt.getClaim(Constant.USER_ROLE).asInt()
  65. );
  66. } catch (JWTDecodeException e) {
  67. serviceLog.error("Token decode happen exception.", e);
  68. throw e;
  69. }
  70. }
  71. }

2.9 其他的一些工具类

ServletUtils:与spring context中有关的一些方法
  1. public final class ServletUtils {
  2. private ServletUtils() {
  3. }
  4. private static final int SCOPE = RequestAttributes.SCOPE_REQUEST;
  5. private static final Supplier<ServletRequestAttributes> servletRequestAttributes = () ->
  6. (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  7. private static final Supplier<HttpServletRequest> request = () -> servletRequestAttributes.get().getRequest();
  8. private static final Supplier<HttpServletResponse> response = () -> servletRequestAttributes.get().getResponse();
  9. private static final Consumer<String> saveUsernameToAttribute = (name) ->
  10. servletRequestAttributes.get().setAttribute(Constant.USER_NAME, name, SCOPE);
  11. private static final Supplier<String> usernameFromAttribute = () ->
  12. (String) servletRequestAttributes.get().getAttribute(Constant.USER_NAME, SCOPE);
  13. private static final Consumer<Integer> saveUserRoleToAttribute = (role) ->
  14. servletRequestAttributes.get().setAttribute(Constant.USER_ROLE, role, SCOPE);
  15. private static final Supplier<Integer> userRoleFromAttribute = () ->
  16. (Integer) servletRequestAttributes.get().getAttribute(Constant.USER_ROLE, SCOPE);
  17. /**
  18. * get token form current request
  19. */
  20. public static Supplier<String> tokenFromRequest = () -> request.get().getHeader(Constant.TOKEN);
  21. /**
  22. * save current user name and role to attribute
  23. */
  24. public static BiConsumer<String, Integer> userNameRoleTo = (name, role) -> {
  25. saveUsernameToAttribute.accept(name);
  26. saveUserRoleToAttribute.accept(role);
  27. };
  28. /**
  29. * get user name and role from attribute
  30. */
  31. public static Supplier<TupleNameRole> userNameRoleFrom = () ->
  32. new TupleNameRole(usernameFromAttribute.get(), userRoleFromAttribute.get());
  33. /**
  34. * add message to response header
  35. */
  36. public static BiConsumer<String, String> addHeader = (key, value) -> response.get().addHeader(key, value);
  37. }

Utils:提供与shiro相同的密码加密方式、获取uuid、shiro的Filter层出错不能使用全局异常处理时的返回信息定制等。

  1. public final class Utils {
  2. private Utils() {
  3. }
  4. /**
  5. * use sha256 encrypt
  6. */
  7. public static Function<String, String> encryptPassword = (password) -> new Sha256Hash(password).toString();
  8. /**
  9. * get uuid
  10. */
  11. public static Supplier<String> uuid = () -> UUID.randomUUID().toString().replace("-", "");
  12. /**
  13. * writer message to response
  14. */
  15. public static BiConsumer<HttpServletResponse, String> renderString = (response, body) -> {
  16. response.setStatus(HttpStatus.OK.value());
  17. response.setCharacterEncoding("utf-8");
  18. response.setContentType("application/json;charset=UTF-8");
  19. try (PrintWriter writer = response.getWriter()) {
  20. writer.print(body);
  21. } catch (IOException e) {
  22. serviceLog.error("response error.", e);
  23. }
  24. };
  25. }

2.10 返回结果定义

  1. @Data
  2. public class ResponseResult<T> implements Serializable {
  3. private static final long serialVersionUID = 1L;
  4. private final String code;
  5. @JSONField(ordinal = 1)
  6. private final String msg;
  7. @JSONField(ordinal = 2)
  8. private T data;
  9. private ResponseResult(String code, String msg) {
  10. this.code = code;
  11. this.msg = msg;
  12. log();
  13. }
  14. private static <T> ResponseResult<T> create(String code, String msg) {
  15. return new ResponseResult<>(code, msg);
  16. }
  17. /**
  18. * No data returned successfully
  19. *
  20. * @return ResponseResult<String>
  21. */
  22. public static <T> ResponseResult<T> success() {
  23. return success(true);
  24. }
  25. /**
  26. * No data returned successfully
  27. *
  28. * @param refreshToken Whether to refresh token
  29. * @return ResponseResult<String>
  30. */
  31. public static <T> ResponseResult<T> success(boolean refreshToken) {
  32. if (refreshToken) TokenUtils.refreshToken();
  33. return create(ErrorMessage.SUCCESS.code(), ErrorMessage.SUCCESS.msg());
  34. }
  35. public static <T> ResponseResult<T> success(T data) {
  36. return success(data, true);
  37. }
  38. /**
  39. * Data returned successfully
  40. *
  41. * @param data data
  42. * @param <T> T
  43. * @param refreshToken Whether to refresh token
  44. * @return ResponseResult<T>
  45. */
  46. public static <T> ResponseResult<T> success(T data, boolean refreshToken) {
  47. ResponseResult<T> responseResult = success(refreshToken);
  48. responseResult.setData(data);
  49. return responseResult;
  50. }
  51. /**
  52. * @param e DCException
  53. * @return ResponseResult<String>
  54. */
  55. public static ResponseResult<String> fail(DataAuthException e) {
  56. return create(e.getCode(), e.getMsg());
  57. }
  58. /**
  59. * @param errorMessage ErrorMessage
  60. * @return ResponseResult<String>
  61. */
  62. public static ResponseResult<String> fail(ErrorMessage errorMessage) {
  63. return create(errorMessage.code(), errorMessage.msg());
  64. }
  65. /**
  66. * @param errorMessage DCException
  67. * @return ResponseResult<String>
  68. */
  69. public static ResponseResult<String> fail(ErrorMessage errorMessage, Object[] detailMessage) {
  70. return create(errorMessage.code(), errorMessage.msg() + Arrays.toString(detailMessage));
  71. }
  72. // Output the information returned
  73. private void log() {
  74. requestLog.info("code:{}, msg:{}", this.getCode(), this.getMsg());
  75. }
  76. }

 

原文链接:https://blog.csdn.net/qq_35754073/article/details/117294507



所属网站分类: 技术文章 > 博客

作者:天花灯

链接:http://www.javaheidong.com/blog/article/207459/ecef980c2ada21d053c1/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

13 0
收藏该文
已收藏

评论内容:(最多支持255个字符)