您的位置:首页 > 房产 > 建筑 > onceperrequestfilter 不生效问题

onceperrequestfilter 不生效问题

2024/12/23 9:00:22 来源:https://blog.csdn.net/u013036688/article/details/140895999  浏览:    关键词:onceperrequestfilter 不生效问题

最近起了一个新的java服务,springboot项目,然后公司内部前端接口调用都通过gateway,同事写了一个公共的jar包,功能是从header中取用户信息,用户信息是gateway写进去的,然后我的新服务引了这个包,但是这玩意儿不起效,get完了是null,所以我去看了看代码,代码如下:

我的调用代码:

Map<String, Object> data = UserContextHolder.getInstance().getContext();

理论上,这个data里有登录用的id姓名之类的,但是get完了这个data是个null,好,继续往里找:

UsercontextHolder里有啥?

public class UserContextHolder {private ThreadLocal<Map<String, Object>> threadLocal = new ThreadLocal();private UserContextHolder() {}public static UserContextHolder getInstance() {return UserContextHolder.SingletonHolder.sInstance;}public void setContext(Map<String, Object> map) {this.threadLocal.set(map);}public Map<String, Object> getContext() {return (Map)this.threadLocal.get();}public void clear() {this.threadLocal.remove();}private static class SingletonHolder {private static final UserContextHolder sInstance = new UserContextHolder();private SingletonHolder() {}}
}

非常好,也很简单,那这玩意儿啥时候赋的值呢?应该在同一个包里,然后我找到了:

package com.aaa.bbb;import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import java.io.IOException;
import java.util.Base64;
import java.util.HashMap;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;@Component
public class TokenAuthenticationFilter extends OncePerRequestFilter {public TokenAuthenticationFilter() {}protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {String userInfo = httpServletRequest.getHeader("x-client-token-user");// 这里省略了一部分,反正就是鼓捣了个map出来HashMap user=parse(userInfo);UserContextHolder.getInstance().setContext(user);filterChain.doFilter(httpServletRequest, httpServletResponse);}
}

看不出有啥问题,启动服务发现这玩意儿没注册上,好的,copy一份到自己的代码里,可以运行,也能注册上。
那么,问题在哪儿呢???
又思考了一会儿,发现了问题所在,就是这个package,我的启动类所在package为:

package com.aaa.ccc;

这个filter的package为:

package com.aaa.bbb;

所以,在启动类上加上:

@ComponentScan(basePackages = {"com.aaa"})

就可以了。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com