2017-12-27 116 views
0

我正在创建一个函数,不会将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; 
    } 
} 
+0

是什么类型'Session'? – Mureinik

+0

会话只是一个组成的类,它具有有关用户会话(名称,ID号码,他是通过浏览器还是手机等登录)的信息。这只是我想要完成的一个例子。 @Mureinik – MkIeKuE

回答

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

相关问题