繁体   English   中英

如何使用Jersey和Java EE 5检索ServletRequest

[英]How to retrieve ServletRequest using Jersey and Java EE 5

我正在创建一个安全库,该库将由多个RESTful客户端使用。 我正在使用Java EE 5,Jersey 1.17和Maven。 客户将使用我的图书馆使用令牌来调用第三方应用程序。 然后,第三方应用程序将返回其在该令牌上拥有的所有信息,例如到期,范围和用户ID。 我的想法是制作一个过滤器,该过滤器将检查是否存在“授权”标头,如果是,它将调用第三方应用程序。 如果第三方应用程序验证了令牌并返回了令牌的信息,那么我需要将该信息(存储在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;
    }

}

您不必在Dao层访问ServletRequest。 在Servlet中,您可以获取ServletRequest对象,并将该值传递到Dao层。 如果您确实要访问,则通过引用将ServletRequest对象传递给Dao层。

<servlet-name>Security API</servlet-name>
<servlet-class>com.packagename.MyServlet</servlet-class>

public MyServlet extends com.sun.jersey.spi.container.servlet.ServletContainer{}

您可以扩展jersey Servlet,也可以通过应用程序类通过应用程序初始化Servlet。

在MyServlet中,您可以到达请求对象。

Servlet信息: https : //jersey.java.net/apidocs/1.17/jersey/com/sun/jersey/spi/container/servlet/ServletContainer.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM