前言:今天整理一下以往的SpringCloud遇到一些常见的问题,顺手做一些笔记,记录一下自己遇到过的坑。
问题1:各服务之间请求的时候由于处于不同服务器或者不同ip的项目下,出现的跨域问题
问题2:各服务之间传递各种参数,但是通过request.setHeader传递参数,如token无法传递到下一个服务里的问题
或者其他参数想近一步传递,但是到了网关这一步缺丢失了!
问题3:有一服务之间上传图片本地服务明明开启大容量size上限,却无法使用
问题1处理办法
//加入一个springboot自项目启动跨域配置,
@Component
@Configuration
public class GateWaysCrosConfig {
@Bean
public CorsFilter corsFilter() {
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
final CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("*");//允许跨域源
config.addAllowedHeader("*");//允许的header参数
config.addAllowedMethod("*");//允许的请求方式
config.setMaxAge(18000L);
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
}
问题2 处理方法 估计这一个步骤遇到的人也比较多
//继承ZuulFilter的实现代码
@Component
public class TokenFilter extends ZuulFilter {
@Autowired
private AsopMangerFeign asopMangerFeign;
/**
* 过滤器类型:
* pre 表示请求之前过滤
*/
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
/**
* 过滤器执行顺序:
* 当一个请求在同一个阶段存在多个过滤的时候,多个过滤器执行顺序
*/
@Override
public int filterOrder() {
return FilterConstants.SEND_ERROR_FILTER_ORDER;
}
/**
* 判断过滤器是否生效
*/
@Override
public boolean shouldFilter() {
return true;
}
/**
* 编写过滤器拦截业务逻辑代码
* 例如:TODO 校验登陆凭证
*/
@Override
public Object run() throws ZuulException {
//获取上下文
RequestContext currentContext = RequestContext.getCurrentContext();
// currentContext.
//获取request
HttpServletRequest request = currentContext.getRequest();
//获取token的时候,从请求头中获取
HttpServletResponse response=currentContext.getResponse();
//response.getHeader("");
String userToken=String.valueOf(request.getParameter("credit"));
if(userToken.equals("null")){
userToken=request.getHeader("token");
}
String logicSysNo=String.valueOf(request.getParameter("logicSysNo"));
if(logicSysNo.equals("null")){
logicSysNo=request.getHeader("logicSysNo");
}
String signKey="vsvTM7nYHwhQZ5dsaazcz/szx";
//singKey token的秘钥,这里我是做演示的,实际效果一样
//userToken为jwt生成的token
Claims claims= CheckUtil.resolveToken(signKey,userToken);
//返回错误提示
//不会继续执行...不会去调用服务接口,网关服务字节响应给客户端
currentContext.setSendZuulResponse(false);
currentContext.setResponseBody("验证失败");
currentContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
return false;
//正常执行调用其它服务接口...
return null;
}
}
//非常关键的一步,上一级服务利用request传递到网关这里时,再传递到下一个服务时候,通过//request.getheaders获取出来为空的问题,在下面的代码进行处理
/**
* 获取登录信息Utils
*
* @author hws
* @since 2018/4/21 15:33
*/
public class CheckUtil {
@Autowired
private static HttpServletRequest request;
/**
* 解析凭证对象
* @param token
* @return
*/
public static Claims resolveToken(String signKey,String token){
Claims claims = null;
try {
claims = Jwts.parser().setSigningKey(signKey).parseClaimsJws(token).getBody();
return claims;
} catch (Exception e) {
return null;
}
}
/**
* 配置用户request信息
*ctx 网关的request上下文对象,jwt加密对象,logicSysNo系统编码
* @return
*/
public static boolean setUserMsg(RequestContext ctx , Claims claims, String logicSysNo) {
// ctx.addZuulRequestHeader()可以把数据加入当前request headers对象里,进行对其他 //服务的参数保留作用
ctx.addZuulRequestHeader("userId", claims.getId());
ctx.addZuulRequestHeader("userName",
ctx.addZuulRequestHeader("orgId",String.valueOf(claims.get("orgId")) );
return true;
}
}
//YML文件里 zuul通过header传递参数时,防止重复header信息出现部分代码
zuul:
#需要忽略的头部信息,不在传播到其他服务
sensitive-headers: Access-Control-Allow-Origin
ignored-headers: Access-Control-Allow-Origin,H-APP-Id,Token,APPToken
问题3 处理办法
//网关服务里,加个bean处理文件size过大的类
@Component
public class BaseConfig {
/**
* 文件上传配置
*/
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
// 单个文件最大 KB,MB
factory.setMaxFileSize("10240KB");
// 设置总上传数据总大小
factory.setMaxRequestSize("102400KB");
return factory.createMultipartConfig();
}
}