jakarta-ee - 如何在不注入(inject) HttpServletRequest 的情况下获取 JAX-RS 资源类中的客户端 IP 地址?

标签 jakarta-ee jax-rs java-ee-6

我们正在使用 JAX-RS 1.0,我想在我的资源类中获取客户端 IP 地址。目前,我将 HttpServletRequest 作为方法参数注入(inject),然后获取 IP 地址。

我想让我的代码更简洁。我在想是否可以使用 MessageBodyReader 类并设置 IP 地址。但是,如果我使用 MessageBodyReader,我必须将 XML 解码为 Java 对象,据我所知,这是额外的逻辑。

谁能告诉我如何在不注入(inject) HttpServletRequest 的情况下获取客户端 IP 地址。

最佳答案

没有什么魔法。你能做的就是包裹 HttpServletRequest到具有请求范围 ( @RequestScoped ) 的 CDI bean 中,然后将此 bean 注入(inject)到您的 JAX-RS 资源类中:

import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;

@RequestScoped
public class RequestDetails {

    @Inject
    private HttpServletRequest request;

    public String getRemoteAddress() {
        return request.getRemoteAddr();
    }
}
import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

@Stateless
@Path("client-address")
public class ClientAddressResource {

    @Inject
    private RequestDetails requestDetails; 

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public Response getClientRemoteAddress() {
        return Response.ok(requestDetails.getRemoteAddress()).build();
    }
}

我知道这种方法与注入(inject)HttpServletRequest没有太大区别。 。 但这并没有什么魔力。

关于jakarta-ee - 如何在不注入(inject) HttpServletRequest 的情况下获取 JAX-RS 资源类中的客户端 IP 地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38243446/

相关文章:

Spring 更改日期输入格式

java - 启动时加载和 Jersey

java - 多部分表单数据不调用 Web 服务 API

java - 安装 Java EE 6 教程示例 : JavaDB error (java. sql.SqlNonTransientConnectionException:recv 失败)

java - 如何在单个数据表中显示来自不同对象类型的不同值?

java - 使用@ElementCollection、@MapKeyJoinColumn 进行多对多关系时引用关键问题

java - 准备好的语句更新 - 性能改进

java - Cucumber 步骤 - 使用持久性上下文测试 EJB 服务

java - weblogic 10.3 上的 ClassCastException jboss-seam

java - Spring 和 Jersey Filter - 提供者还是组件?