4

在 Jersey 1.x 中,我们从 (Jersey) 会话属性访问 Wicket 会话,如此处所述https://stackoverflow.com/a/15767824/1399659

在迁移到 Jersey 2.x 时,使用ContainerRequestFilter似乎是正确的模式,它也允许 Spring bean 注入。我们通过包括

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

作为 ServletContainer 的 init-param 并在 ContainerRequestFilter 实现上使用 @Provider 注释。但是这个容器过滤器是一个单例,不可能将 HttpServletRequest 注入其中(参见JERSEY-2114

在 filter() 方法中,我们可以访问ContainerRequestContext但不能从那里访问 HttpServletRequest。

那么有没有办法:

  1. 在 servlet 过滤器中启用 Spring bean 注入(也使用 Jersey)?
  2. 从 ContainerRequestFilter 中访问 servlet 请求?
  3. 以其他方式从具有 Jersey 过滤能力的 Spring-bean-aware 对象访问检票口会话?

`

import java.io.IOException;

import javax.servlet.http.HttpSession;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.ext.Provider;

import org.apache.wicket.injection.Injector;

@Provider
public class SecurityContextFilter implements ContainerRequestFilter {

//@Context
//HttpServletRequest webRequest;

@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
    //HttpSession httpSession = webRequest.getSession();
    //MyWicketSession mySession = (MyWicketSession) httpSession.getAttribute("wicket:" + BaseConstants.WICKET_FILTER_NAME + ":session");
    //doAuthCheck(mySession, requestContext);
}
...
}

`

提前致谢

4

1 回答 1

10

在泽西岛 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 使用旧的 Jersey 2.0。您将不得不使用这些技巧来升级 Jersey (尚未证明效果很好)。或者更好的方法是下载Glassfish 4.0.1 的夜间版本。但目前还不是完全稳定。我希望新版本能尽快发布。

于 2013-11-05T13:11:02.183 回答