我正在创建一个不将HttpServletRequest对象作为参数的函数,因为它取决于会话(可以通过移动设备或Web浏览器)。如果它是移动设备,它使用纬度和经度,或者如果它来自网络浏览器,我希望能够获取IP地址。有没有办法实现这个目标?我看到的每个例子都以HttpServletRequest为参数。
这是我想要完成的一个例子,如果可能的话。
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;
}
}
答案 0 :(得分:0)
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()