在 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。
那么有没有办法:
- 在 servlet 过滤器中启用 Spring bean 注入(也使用 Jersey)?
- 从 ContainerRequestFilter 中访问 servlet 请求?
- 以其他方式从具有 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);
}
...
}
`
提前致谢