2017-12-27 525 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()

相關問題