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

时间:2017-12-27 18:46:17

标签: java servlets

我正在创建一个不将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;
    }
}

1 个答案:

答案 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()