Spring 如何从Jersey-2请求筛选器访问wicket会话?

Spring 如何从Jersey-2请求筛选器访问wicket会话?,spring,jersey,wicket,jersey-2.0,Spring,Jersey,Wicket,Jersey 2.0,在Jersey 1.x中,我们从(Jersey)会话属性访问Wicket会话,如下所述 在迁移到Jersey 2.x时,使用a似乎是合适的模式,它还允许SpringBean注入。我们成功地完成了这项工作,包括 <param-name>jersey.config.server.provider.packages</param-name> ` 提前感谢泽西岛2.4版: import javax.annotation.Priority; import javax.ws.rs.

在Jersey 1.x中,我们从(Jersey)会话属性访问Wicket会话,如下所述

在迁移到Jersey 2.x时,使用a似乎是合适的模式,它还允许SpringBean注入。我们成功地完成了这项工作,包括

<param-name>jersey.config.server.provider.packages</param-name>
`

提前感谢泽西岛2.4版:

import javax.annotation.Priority;
import javax.ws.rs.Priorities;

@Provider
@Priority(Priorities.AUTHENTICATION)
public class AuthRequestFilter implements ContainerRequestFilter {
    @Context
    HttpServletRequest webRequest;

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        final HttpSession session = webRequest.getSession();

        requestContext.setSecurityContext(new SecurityContext() {
            @Override
            public Principal getUserPrincipal() {
                return new PrincipalImpl((String)session.getAttribute("USER_NAME"));
            }

            @Override
            public boolean isUserInRole(String s) {
                return false;
            }

            @Override
            public boolean isSecure() {
                return false;
            }

            @Override
            public String getAuthenticationScheme() {
                return null;
            }
        });
    }
}
您也可以注册筛选器,而无需使用@Provider注释:

import org.glassfish.jersey.server.ResourceConfig;
import javax.ws.rs.ApplicationPath;

/**
 * Root REST resource class.
 */
@ApplicationPath("/rest")
public class RootResource  extends ResourceConfig {
    /**
     * Initializes all resources from REST package.
     */
    public RootResource() {
        packages("com.example.rest");
        register(AuthRequestFilter.class);
    }
}
注:Glassfish 4.0.0使用旧球衣2.0。
您将不得不使用升级Jersey(未证明其工作良好)。或者更好的方法是下载,但目前还不完全稳定。我希望新版本能很快发布。

效果不错,谢谢!其他人也可以注意到,如果由于缺少对
jersey.config.server.Provider.packages
init param(例如在WebSphere中)的支持而无法使用
@Provider
etc注释,那么同样可以通过在
getSingletons()中传递提供者类的实例来实现
在您实现的
javax.ws.rs.core.Application
中,或者扩展ResourceConfig并在那里注册筛选器。My
ContainerRequestFilter
在应用程序启动期间创建一次,因此当调用My
filter
方法时,
HttpServletRequest
不会被注入。知道我做错了什么吗?当过滤器注册为提供者时,Jersey试图注入@Context属性,但失败了,因为它发生在请求链之外。如何在没有提供商的情况下注册筛选器?我实际上按照指示升级了Jersey,并不断为请求获取空值。。。直到那时,我才无意中发现了这个问题。。。这都是关于注册你的过滤器。。。如果注册实例而不是类,那么注入将失败
import org.glassfish.jersey.server.ResourceConfig;
import javax.ws.rs.ApplicationPath;

/**
 * Root REST resource class.
 */
@ApplicationPath("/rest")
public class RootResource  extends ResourceConfig {
    /**
     * Initializes all resources from REST package.
     */
    public RootResource() {
        packages("com.example.rest");
        register(AuthRequestFilter.class);
    }
}