L'IP da solo non serve a nulla ma se lo si associa ad un cookie con un nome univoco ed una chiave sempre diversa si riesce a monitorare molto bene il traffico sul proprio sito.
Lavorare con IPv4 oppure con IPv6 cambia e anche parecchio, rischio di registrare a database 2 record per un solo IP (per esmpio basta che l'utente si connetta con Chrome e poi con Mozilla).
Comunque questo Spring Boot fa acqua da tutte le parti. Il mio codice è perfetto ed i problemi sono tanti:
1) Su Mozilla il mio IP è il seguente:
0000:0000:0000:0000:0000:ffff:7f00:0001
invece di questo:
0000:0000:0000:0000:0000:0000:0000:0001
2) Il metodo per cercare un cookie non funziona. Il cookie è presente nel browser ma non viene trovato.
Ecco il mio progettino (
come vedi è molto semplice la cosa che sto facendo, non mi interessa neppure differenziare le visite per pagine diverse):
CREATE TABLE IF NOT EXISTS contavisite (
id BIGSERIAL NOT NULL,
ip VARCHAR(39) NOT NULL,
data_ora TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT contavisite_pk PRIMARY KEY(id),
CONSTRAINT contavisite_uip UNIQUE (ip)
);
@Controller
public class ControlloPagineWeb {
// ...
public void variabiliGeneraliPerPaginaHTML(
Principal principal,
Model model,
HttpSession session,
HttpServletRequest request,
HttpServletResponse response
){
// ...
try{
ConteggioVisiteSito conteggioVisiteSito = new ConteggioVisiteSito(session, request, response);
}catch (Exception e){
// System.out.println("Impossibile eseguire il conteggio delle visite.");
}
// ...
}
@RequestMapping(value = { "/", "/benvenuto" }, method = RequestMethod.GET)
public String paginaBenvenuto(
Model model,
Principal principal,
HttpSession session,
HttpServletRequest request,
HttpServletResponse response
) {
variabiliGeneraliPerPaginaHTML(principal, model, session, request, response);
model.addAttribute("titolo", "Benvenuto!");
model.addAttribute("messaggio", "Benvenuto!");
return "index";
}
// ...
}
// Questa classe esegue il conteggio delle visite ricevute dal sito.
public class ConteggioVisiteSito {
private final String nomeCookie = "clientSuGestioneUtenti";
private final String nomeVariabileDiSessione = "clientSuGestioneUtenti";
private final String attributoVariabileDiSessione = "presente";
public ConteggioVisiteSito() {
}
public ConteggioVisiteSito(HttpSession session, HttpServletRequest request, HttpServletResponse response) {
creaSessione(session, request, response);
}
public void creaSessione(HttpSession session, HttpServletRequest request, HttpServletResponse response){
try{
if(!(
session.getAttribute(nomeVariabileDiSessione)!=null &&
session.getAttribute(nomeVariabileDiSessione).equals(attributoVariabileDiSessione)
)){
session.setAttribute(nomeVariabileDiSessione, attributoVariabileDiSessione);
conta(request, response);
}
}catch (Exception e){
conta(request, response);
}
}
public void conta(HttpServletRequest request, HttpServletResponse response){
try{
System.out.println("");
System.out.println("");
System.out.println("");
System.out.println("conteggio la visita");
creaCookie(response,nomeCookie,String.valueOf(1));
System.out.println(cercaCookie(request,nomeCookie,String.valueOf(1)));
System.out.println(cercaCookie(request,nomeCookie,String.valueOf(2)));
System.out.println(cercaCookie(request,"h",String.valueOf(1)));
System.out.println(cercaCookie(request,"h",String.valueOf(10)));
cancellaCookie(response,nomeCookie);
System.out.println(ipDelClient());
System.out.println(ipDelServer());
}catch (Exception e){
// System.out.println("Impossibile eseguire il conteggio delle visite.");
}
}
public boolean cercaCookie(HttpServletRequest request, String nomeCookie, String valoreCookie){
try{
Cookie[] cookies = request.getCookies();
for(int i=0; i<cookies.length; i++){
if(cookies[i].getName().equals(nomeCookie) && cookies[i].getValue().equals(valoreCookie)){
return true;
}
}
return false;
}catch (Exception e){
return false;
}
}
public void creaCookie(HttpServletResponse response, String nomeCookie, String valoreCookie){
try{
Cookie cookie = new Cookie(nomeCookie, valoreCookie);
int secondi = 2147483647;
cookie.setMaxAge(secondi);
cookie.setHttpOnly(true);
cookie.setPath("/");
response.addCookie(cookie);
}catch (Exception e){
// System.out.println("Impossibile eseguire il conteggio delle visite.");
}
}
public void cancellaCookie(HttpServletResponse response, String nomeCookie){
try{
Cookie cookie = new Cookie(nomeCookie, null);
int secondi = 0;
cookie.setMaxAge(secondi);
cookie.setHttpOnly(true);
cookie.setPath("/");
response.addCookie(cookie);
}catch (Exception e){
// System.out.println("Impossibile eseguire il conteggio delle visite.");
}
}
public String ipDelClient(){
try{
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
.getRequest();
return fromIPv4ToIPv6(request.getRemoteAddr());
}catch (Exception e){
return "";
}
}
public String ipDelServer(){
try{
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
.getRequest();
return fromIPv4ToIPv6(request.getLocalAddr());
}catch (Exception e){
return "";
}
}
public String fromIPv4ToIPv6(String IPv4){
try{
if(IPv4!=null && !IPv4.isEmpty()){
IPAddress address = new IPAddressString(IPv4).getAddress();
IPv6Address ipv6Address = address.toIPv6();
String IPv6 = String.valueOf(ipv6Address.toFullString());
return IPv6;
}else{
return "";
}
}catch (Exception e){
return "";
}
}
}