java - Spring Rest 在上下文中设置自定义对象
问题描述
我正在使用 Spring Rest 来创建 Rest API。对于身份验证,我创建了一个从 扩展的过滤器OncePerRequestFilter
,该过滤器检查标头中是否存在有效令牌。我必须在 Spring 上下文中设置一些自定义对象信息。这样我就可以在我的 Controller 类中检索它。就像是:
AuthenticationFilter extends OncePerRequestFilter {
// validation goes here
requestContext.setSecurityContext(new SecurityContext() {
public Principal getUserPrincipal() {
return new UserInfo("", token, userID, userType);
}
}
});
解决方案
不要为身份验证创建自定义过滤器。相反,用户安全上下文非常强大。
我不知道如何将自定义对象放入 spring 上下文中。但我可以向您展示如何在 Spring 框架中创建自定义上下文,然后将其用作任何其他上下文。当然,您将能够将自定义对象放入其中。
伪代码:
1.)创建您想要在上下文中拥有的自定义对象:
public class UserInfo implements Serializable {
private String id;
private String email;
//Getters and setters
}
2.) 创建自定义上下文:
@Service
public class UserInfoContext {
private static final ThreadLocal<UserInfo> userInfoThreadLocal = new InheritableThreadLocal<>();
public void setUserInfo(UserInfo userInfo) {
UserInfoContext.userInfoThreadLocal.set(userInfo);
}
public UserInfo getUserInfo() {
return UserInfoContext.userInfoThreadLocal.get();
}
public void clearContext() {
UserInfoContext.userInfoThreadLocal.remove();
}
}
3.) 创建自定义拦截器以在自定义上下文中初始化自定义对象
@Service
public class UserInfoInterceptor implements HandlerInterceptor {
private UserInfoContext userInfoContext;
@Autowired
public UserInfoInterceptor(UserInfoContext userInfoContext) {
this.userInfoContext = userInfoContext;
}
@Override
public boolean preHandle(HttpServletRequest requestServlet, HttpServletResponse responseServlet, Object handler) throws Exception {
// Call userInfoContext.setUserInfo() with custom data.
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) throws Exception {
userInfoContext.clearContext();
}
}
感谢 ThreadLocal,您可以保存有关当前用户的自定义信息。
推荐阅读
- java - 使代码在执行的操作中从同一位置继续
- microsoft-cognitive - 从图像存储中匹配图像的认知服务?
- javascript - Terminate a function whenever it is executed - Javascript
- c# - asp.net core 2.0 模型验证不验证数据
- java - 使用 Java 中的 Geotools 检索 WFS 地图内容
- r - 使用 R/plotly 在轴标题中写入符号摄氏度
- javascript - 从克隆的 React 组件中删除一个道具
- php - preg_match - text between closing and opening tag
- python - 为什么 Django REST Framework 嵌套序列化程序 self.instance 总是返回 None?
- unit-testing - Mock external dependencies in golang