diff --git a/mall-ebtp-cloud-security-starter/src/main/java/com/chinaunicom/mall/ebtp/cloud/security/starter/UserAuthenticationEntryPoint.java b/mall-ebtp-cloud-security-starter/src/main/java/com/chinaunicom/mall/ebtp/cloud/security/starter/UserAuthenticationEntryPoint.java index 2123721..703b426 100644 --- a/mall-ebtp-cloud-security-starter/src/main/java/com/chinaunicom/mall/ebtp/cloud/security/starter/UserAuthenticationEntryPoint.java +++ b/mall-ebtp-cloud-security-starter/src/main/java/com/chinaunicom/mall/ebtp/cloud/security/starter/UserAuthenticationEntryPoint.java @@ -9,6 +9,7 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.apache.commons.lang3.StringUtils; import org.springframework.http.HttpStatus; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.AuthenticationEntryPoint; @@ -25,12 +26,12 @@ public class UserAuthenticationEntryPoint implements AuthenticationEntryPoint { @Override public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { - response.setStatus(HttpStatus.UNAUTHORIZED.value()); response.setContentType("application/json;charset=utf-8"); String code = (String) request.getSession().getAttribute("code"); - Map map = adapterException(code); + Map map = adapterException(StringUtils.defaultIfBlank(code, "System Generic Error"), response); + map.put("success", "false"); map.put("path", request.getServletPath()); map.put("timestamp", String.valueOf(new Date().getTime())); @@ -44,28 +45,28 @@ public class UserAuthenticationEntryPoint implements AuthenticationEntryPoint { /** * @param code */ - private Map adapterException(String code) { - if ("90403".equals(code)) { - return accessDenidedException(code); + private Map adapterException(String code, HttpServletResponse response) { + switch (code) { + case "90403": + return accessDenidedException(code, response); + case "90500": + return remoteTimeoutException(code, response); + default: + return globalException(code, response); } - - if ("90500".equals(code)) { - return remoteTimeoutException(code); - } - - return globalException(code); } /** - * token 失效异常 + * token 已失效 * * @param code * @return */ - private Map accessDenidedException(String code) { + private Map accessDenidedException(String code, HttpServletResponse response) { + response.setStatus(HttpStatus.UNAUTHORIZED.value()); + Map map = new HashMap<>(); map.put("code", code); - map.put("success", "false"); map.put("message", "登录已超期"); return map; @@ -77,11 +78,12 @@ public class UserAuthenticationEntryPoint implements AuthenticationEntryPoint { * @param code * @return */ - private Map remoteTimeoutException(String code) { + private Map remoteTimeoutException(String code, HttpServletResponse response) { + response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); + Map map = new HashMap<>(); map.put("code", code); - map.put("success", "false"); - map.put("message", "token验证失败"); + map.put("message", "网络繁忙,请稍后再试"); return map; } @@ -89,10 +91,11 @@ public class UserAuthenticationEntryPoint implements AuthenticationEntryPoint { /** * @return */ - private Map globalException(String code) { + private Map globalException(String code, HttpServletResponse response) { + response.setStatus(HttpStatus.UNAUTHORIZED.value()); + Map map = new HashMap<>(); - map.put("code", 500); - map.put("success", "false"); + map.put("code", -1); map.put("message", code); return map; diff --git a/mall-ebtp-cloud-security-starter/src/main/java/com/chinaunicom/mall/ebtp/cloud/security/starter/client/UserCenterClient.java b/mall-ebtp-cloud-security-starter/src/main/java/com/chinaunicom/mall/ebtp/cloud/security/starter/client/UserCenterClient.java index 8c8ba01..32a5a13 100644 --- a/mall-ebtp-cloud-security-starter/src/main/java/com/chinaunicom/mall/ebtp/cloud/security/starter/client/UserCenterClient.java +++ b/mall-ebtp-cloud-security-starter/src/main/java/com/chinaunicom/mall/ebtp/cloud/security/starter/client/UserCenterClient.java @@ -4,6 +4,7 @@ import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import com.chinaunicom.mall.ebtp.cloud.security.starter.config.FeignClientConfiguration; import com.chinaunicom.mall.ebtp.cloud.security.starter.entity.SecurityUser; import com.chinaunicom.mall.ebtp.cloud.security.starter.fallback.UserCenterClientFallback; @@ -12,7 +13,7 @@ import com.chinaunicom.mall.ebtp.cloud.security.starter.fallback.UserCenterClien * * @author Ajaxfan */ -@FeignClient(name = "${mall-ebtp.userinfo.id}", fallback = UserCenterClientFallback.class) +@FeignClient(name = "${mall-ebtp.userinfo.id}", fallback = UserCenterClientFallback.class, configuration = FeignClientConfiguration.class) public interface UserCenterClient { /** diff --git a/mall-ebtp-cloud-security-starter/src/main/java/com/chinaunicom/mall/ebtp/cloud/security/starter/config/FeignClientConfiguration.java b/mall-ebtp-cloud-security-starter/src/main/java/com/chinaunicom/mall/ebtp/cloud/security/starter/config/FeignClientConfiguration.java new file mode 100644 index 0000000..ada12d8 --- /dev/null +++ b/mall-ebtp-cloud-security-starter/src/main/java/com/chinaunicom/mall/ebtp/cloud/security/starter/config/FeignClientConfiguration.java @@ -0,0 +1,55 @@ +package com.chinaunicom.mall.ebtp.cloud.security.starter.config; + +import static feign.FeignException.errorStatus; + +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import feign.FeignException; +import feign.Logger; +import feign.RetryableException; +import feign.codec.ErrorDecoder; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Configuration +public class FeignClientConfiguration { + + @Bean + public Logger.Level feignLoggerLevel() { + return Logger.Level.BASIC; + } + + @Bean + public ErrorDecoder errorDecoder() { + return (methodKey, response) -> { + FeignException exception = errorStatus(methodKey, response); + + log.error("error message: {}", exception.getMessage()); + + int status = response.status(); + + if (status >= 400 && status <= 500) {// 客户端异常,启用feign的重试机制 + return new RetryableException(response.status(), exception.getMessage(), + response.request().httpMethod(), exception, retryAfter(), response.request()); + } + return exception; + }; + } + + /** + * 延迟 n 秒后重试 + * + * @return + */ + private Date retryAfter() { + Calendar cal = GregorianCalendar.getInstance(); + + return cal.getTime(); + } + +} diff --git a/mall-ebtp-cloud-security-starter/src/main/java/com/chinaunicom/mall/ebtp/cloud/security/starter/fallback/UserCenterClientFallback.java b/mall-ebtp-cloud-security-starter/src/main/java/com/chinaunicom/mall/ebtp/cloud/security/starter/fallback/UserCenterClientFallback.java index 528898d..648dd74 100644 --- a/mall-ebtp-cloud-security-starter/src/main/java/com/chinaunicom/mall/ebtp/cloud/security/starter/fallback/UserCenterClientFallback.java +++ b/mall-ebtp-cloud-security-starter/src/main/java/com/chinaunicom/mall/ebtp/cloud/security/starter/fallback/UserCenterClientFallback.java @@ -5,11 +5,15 @@ import org.springframework.stereotype.Component; import com.chinaunicom.mall.ebtp.cloud.security.starter.client.UserCenterClient; import com.chinaunicom.mall.ebtp.cloud.security.starter.entity.SecurityUser; +import lombok.extern.slf4j.Slf4j; + +@Slf4j @Component public class UserCenterClientFallback implements UserCenterClient { @Override public SecurityUser getUserInfo() { + log.info("remote access timeout."); return null; } diff --git a/mall-ebtp-cloud-security-starter/src/main/resources/security-configuration.properties b/mall-ebtp-cloud-security-starter/src/main/resources/security-configuration.properties index 37d2b46..c6b5b60 100644 --- a/mall-ebtp-cloud-security-starter/src/main/resources/security-configuration.properties +++ b/mall-ebtp-cloud-security-starter/src/main/resources/security-configuration.properties @@ -1,3 +1,3 @@ user.auth.csrf.disable=true -mall-ebtp.userinfo.id=core-service-ebtp-userinfo \ No newline at end of file +mall-ebtp.userinfo.id=core-service-ebtp-userinfo