这是我的身份验证过滤器:
public class AuthenticationFilter implements ContainerRequestFilter {
private static Logger logger = LoggerFactory.getLogger(AuthenticationFilter.class);
@Autowired
private AuthenticationService service;
@Override
public void filter(ContainerRequestContext context) throws IOException {
String token = context.getHeaderString("mytoken");
if (token == null || token.isEmpty()) {
String message = "token.null_empty";
logger.warn("{}: Token is required to access to personal data (resource {}) => reject request", message, context.getUriInfo().getBaseUri());
throw new AuthenticationException(ErU2, message);
}
// check token and retrieve user information
logger.debug("Checking validity of token {}", token);
IUser user = this.service.getUser(token);
logger.warn("======= AuthenticationFilter#filter token={}, user={}", token, user);
// set user data as request property
context.setProperty("user", user);
logger.warn("======= AuthenticationFilter#filter token={}, user#context.setProperty={}", token, (IUser) context.getProperty("user"));//In this line ihave user not null
}
}
@Path("perso")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON + ";charset=UTF-8")
@Component
public class PersonalSpace {
private static Logger logger LoggerFactory.getLogger(PersonalSpace.class);
@Context
private ContainerRequestContext context;
private IUser getUser() {
logger.debug("[IN] PersonalSpace#getUser");
IUser user = (IUser) this.context.getProperty("user");//This returns null
logger.warn("======= PersonalSpace#getUser user={}", user);
return user;
}
@GET
@Path("/skanso/data")
public Response getData(@QueryParam("start") Integer start, @QueryParam("number") Integer number,
List<Integer> ids) {
return dataOperator.getDataLimitedList(getUser(), start, number, ids);
}
}
当我使用单个请求进行测试时,此代码可以很好地工作,但是在并发请求时,this.context.getProperty(“user”)返回null。
是否有解决方案threadSafe或类似的东西?
请保存我的头发:)