簡體   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