有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    注入javax.inject.Provider<HttpServletRequest>。将提供程序传递到Function构造函数中,并在Funtion#apply()方法中调用provider.get()^{}用于延迟检索。在这种情况下,您需要使用它,因为启动时没有请求