有没有办法编写一个函数,使用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