【发布时间】:2014-12-09 16:04:45
【问题描述】:
我正在创建一个可供多个 RESTful 客户端使用的安全库。我正在使用 Java EE 5、Jersey 1.17 和 Maven。客户将使用我的库使用令牌调用第三方应用程序。然后,第三方应用程序将返回它在该令牌上的所有信息,如过期、范围和用户 ID。 我的想法是制作一个过滤器来检查是否有 Authorization 标头,如果是这样,它会调用第三方应用程序。如果第三方应用程序验证了令牌并返回了令牌的信息,我需要将存储在 TokenInformation 对象中的信息返回给资源。在之前的帖子中,有人说我可以这样做:
public class MyFilter implements Filter{
@Override
public void doFilter(final ServletRequest request,
final ServletResponse response,
final FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
String header = req.getHeader("Authorization");
TokenInformation info = new TokenInformation();
info = buildInfo(info);
if (true) {
request.setAttribute("auth", info);
chain.doFilter(request, response);
} else {
handleError(response);
}
}
}
因此,通过将 TokenInformation 对象作为附加属性发送到请求,我可以稍后在资源类中检索它。问题是我使用的是 Java EE 5,但我没有意识到我不能使用 @Context 注释来注入 ServletRequest 对象。如何从资源类再次访问 ServletRequest 对象,以便可以访问例如 DAO 中的 TokenInformation 对象?
我使用球衣的方式是在我的web.xml:
<servlet>
<servlet-name>Security API</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.ni.apps.engineering.securitylibrary.resources.SecurityResource</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Security API</servlet-name>
<url-pattern>/1/*</url-pattern>
</servlet-mapping>
SecurityResource 类有这个:
public class SecurityResource extends Application{
public static final String SUPPORTED_REPRESENTATIONS = MediaType.APPLICATION_XML
+ "," + MediaType.APPLICATION_JSON;
@Override
public Set<Class<?>> getClasses() {
HashSet<Class<?>> set = new HashSet<Class<?>>();
set.add(Security.class);
return set;
}
}
Security 类有这个:
@Path("")
public class Security implements ISecurity{
@Override
public Response get(String upId) {
String test = "";
try{
TokenInformation tI = (TokenInformation) HttpServletRequestWrapper.
test = "test1";
}catch(Exception e){
System.out.println(e.getMessage());
}
return null;
}
}
【问题讨论】:
标签: java servlets jersey java-ee-5