【问题标题】:How to retrieve ServletRequest using Jersey and Java EE 5如何使用 Jersey 和 Java EE 5 检索 ServletRequest
【发布时间】: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


    【解决方案1】:

    您不必在 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,并且可以通过编程方式使用 Application Class 初始化 Servlet。

    在 MyServlet 中,您可以访问请求对象。

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

    【讨论】:

    • 我不确定如何访问 servlet 本身,所以我添加了更多信息,希望您能指出正确的路径。
    • 你在MVC模式中使用哪一种? JSF,Spring MVC,Struts,Servlet
    • 我添加了其他信息,希望对您有所帮助!
    • 这会很难,但你可以按照我的理解去做。
    • 您能否在答案中添加更多信息,以了解如何获取 Servlet 对象?
    猜你喜欢
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    相关资源
    最近更新 更多