java从javax访问HttpServletContext或会话。ws。rs.core。特色
上下文
我正在迁移一个旧的遗留jersey应用程序,以使用更新的版本(2.27)
应用程序使用jetty servlet来处理身份验证,并在HttpSession内设置登录信息
然后我们有一些插件使用jersey并从注释(@sduser)接收身份验证令牌
应用程序很大,我希望避免身份验证方法的迁移过程
迁移前
我使用了一个与AbstractValueFactoryProvider链接的抽象活页夹,后者提供了AbstractContainerRequestValueFactory
这个AbstractContainerRequestValueFactory让我可以访问RessourceContext,在那里我可以获得HttpSession
private static final class IdentityParamValueFactory extends AbstractContainerRequestValueFactory<UserManagement.User> {
private final UserManagement userManagement;
@Context
private ResourceContext context;
public IdentityParamValueFactory(final UserManagement userManagement) {
this.userManagement = userManagement;
}
public UserManagement.User provide() {
final HttpServletRequest request = context.getResource(HttpServletRequest.class);
HttpSession session = request.getSession();
//... code ommited
}
现在
我已经修改了代码,使用了一个功能和一个抽象活页夹:
public class UserBinder implements Feature {
private final UserManagement userManagement;
public UserBinder(final UserManagement userManagement) {
this.userManagement = userManagement;
}
@Override
public boolean configure(final FeatureContext context) {
context.register(new AbstractBinder() {
@Context
private HttpServletRequest webRequest;
@Override
protected void configure() {
UserValueParamProvider userValueParamProvider = new UserValueParamProvider(userManagement, webRequest);
bind(userValueParamProvider)
.to(ValueParamProvider.class)
.in(RequestScoped.class);
}
});
return true;
}
public static class UserValueParamProvider implements ValueParamProvider {
// SLF4J Logger
private static final Logger LOG = LoggerFactory.getLogger(UserBinder.class);
private final UserManagement userManagement;
private HttpServletRequest webRequest;
private UserValueParamProvider(final UserManagement userManagement, HttpServletRequest webRequest) {
this.userManagement = userManagement;
this.webRequest = webRequest;
}
@Override
public Function<ContainerRequest, UserManagement.User> getValueProvider(final Parameter parameter) {
if (parameter.getRawType().equals(UserManagement.User.class)
&& parameter.isAnnotationPresent(SdnUser.class)) {
return context -> {
ContainerRequest containerRequest = (ContainerRequest) context.getRequest();
// The next line is invalid, as the request is a ContainerRequest not an HttpServletRequest
HttpServletRequest request = (HttpServletRequest) context.getRequest();
HttpSession session = request.getSession();
// ... code ommited
但是getValueProvider的函数返回没有上下文注入,我无法访问HttpSession
如何在注释活页夹中访问HttpSession
# 1 楼答案
注入} 用于延迟检索。在这种情况下,您需要使用它,因为启动时没有请求
javax.inject.Provider<HttpServletRequest>
。将提供程序传递到Function
构造函数中,并在Funtion#apply()
方法中调用provider.get()
^{