有没有办法编写一个函数,使用HttpServletRequest获取IP地址而不将其作为参数传递?

我正在创建一个函数,不会将HttpServletRequest对象作为参数,因为根据会话(可能是通过移动设备或Web浏览器)。如果它是移动设备,它使用纬度和经度,或者如果它来自网络浏览器,我希望能够获取IP地址。有没有办法做到这一点?我看到的每个示例都以HttpServletRequest为参数。有没有办法编写一个函数,使用HttpServletRequest获取IP地址而不将其作为参数传递?

这是我想如果可能的话来完成的,什么的例子。

public String getLocation(Session session) { 

switch(session.getLocation()) {

case Mobile:

System.out.printf("Latitude is %s and Longitude is %s\n", session.getLatitude(), session.getLongitude());

break;

case Web:

HttpServletRequest request;

String ipAddress = request.getRemoteAddr();

System.out.printf("The IP Adress is %s", ipAddress);

break;

default:

System.out.print("Error\n");

break;

}

}

回答:

IP地址是请求的属性。会话可能对应于许多请求(包括该会话),并且它们可能来自不同的IP地址。所以不可能以某种“标准”方式从Session获得唯一的IP地址。

但是你可以做的是在请求过滤器中存储一个IP地址到它的会话。例如,每个请求可以简单地将其IP地址写入会话的属性,因此您可以随时访问该会话中最后一个请求的IP地址。或者你可以实现一些Accumulator并将它存储在你的会话中,并将请求的IP地址放到Accumulator上,这将实现一些逻辑(如选择“最流行的”IP地址或做其他事情)。这取决于你。

如何实现过滤器:

public class RequestIPSavingFilter implements Filter { 

@Override

public void doFilter(ServletRequest req, ServletResponse resp,

FilterChain chain) throws IOException, ServletException {

if (req instanceof HttpServletRequest) {

HttpServletRequest request = (HttpServletRequest) req;

final String ipAddress = request.getRemoteAddr();

Accumulator accumulator = (Accumulator) request.getSession().getAttribute("accumulator");

if (accumulator == null) {

accumulator = new Accumulator();

request.getSession().setAttribute("accumulator", accumulator);

}

accumulator.putIpAddress(ipAddress);

}

chain.doFilter(req, resp);

}

@Override

public void init(FilterConfig filterConfig) throws ServletException {

}

@Override

public void destroy() {

}

}

后来,在您的会话处理代码,你做

Accumulator accumulator = (Accumulator) request.getSession().getAttribute("accumulator"); 

,并使用accumulator.getBestIpAddress()

以上是 有没有办法编写一个函数,使用HttpServletRequest获取IP地址而不将其作为参数传递? 的全部内容, 来源链接: utcz.com/qa/266968.html

回到顶部