Spring 如何从Jersey-2请求筛选器访问wicket会话?
在Jersey 1.x中,我们从(Jersey)会话属性访问Wicket会话,如下所述 在迁移到Jersey 2.x时,使用a似乎是合适的模式,它还允许SpringBean注入。我们成功地完成了这项工作,包括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.
<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并在那里注册筛选器。MyContainerRequestFilter
在应用程序启动期间创建一次,因此当调用Myfilter
方法时,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);
}
}