项目场景:
项目Springboot +shiro +Gateway
问题描述
请求路径添加到了过滤器,配置anno
但请求仍被最后配置的/**,jwtfilter拦截
//测试模块排除 filterChainDefinitionMap.put("/hello/**", "anon"); // 添加自己的过滤器并且取名为jwt Map<String, Filter> filterMap = new HashMap<String, Filter>(1); Object cloudServer = env.getProperty(CommonConstant.CLOUD_SERVER_KEY); filterMap.put("jwt", new JwtFilter()); shiroFilterFactoryBean.setFilters(filterMap); // <!-- 过滤链定义,从上向下顺序执行,一般将/**放在最为下边 filterChainDefinitionMap.put("/**", "jwt");
原因分析:
按照网上解决方案:
1. LinkedHashMap
2. new JwtFilter()
尝试还是不对,估计原因还是在请求路径和过滤器路径上,因为我引用了gateway作用路,对路径进行了加工
最终发现,是gateway路径时,对路径的加工不对,这样请求转发过来会带上服务名,导致路径匹配不上。
{
"id": "ems-dc",
"order": -1,
"predicates": [
{
"name": "Path",
"args": {
"_genkey_0": "/ems-dc/**"
}
}
],
"uri": "lb://ems-dc"
},
解决方案:
{
"id": "ems-dc",
"order": -1,
"predicates": [
{
"name": "Path",
"args": {
"_genkey_0": "/ems-dc/**"
}
}
],
"filters": [
{
"name": "StripPrefix",
"args": {
"_genkey_0": "1"
}
}
],
"uri": "lb://ems-dc"
},
加上filter,截取服务名,问题解决。