Is there any way to implement a listener for all the clicks that are given in a Java session?

1

As the question says, can you create a listener that detects every click that occurs in the open session of Java ?. My intention is to save it in a database in order to reproduce exactly what each user does in the session, type an audit trail.

    
asked by Garrizano 22.11.2016 в 15:27
source

2 answers

2

You can not save each user "click" in the web application. What you can do is place a filter that fires every time the user sends a request from the application.

@WebFilter("/*")
public class FiltroAplicacion implements Filter {

    @Override
    public void init(FilterConfig config) throws ServletException {

    }

    //este método se ejecuta antes y después del ciclo request/response
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

        //Obtenemos los objetos de request, response y sesión
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        HttpSession session = request.getSession(false);
        //a partir de la sesión podemos obtener el usuario y su información
        if (session != null) {
            Usuario usuario = (Usuario)session.getAttribute("usuario");
            //si el usuario existe, es decir, se ha logueado al sistema
            if (usuario != null) {
                //podemos ver qué acción ejecutó
                //mediante la URL del request
                String urlBase = request.getRequestURL().toString();
                //y los parámetros de query string
                //los que vienen luego de "?" en la url
                String queryString = request.getQueryString();
                //aquí puedes guardar esto en algún lugar
                //log, base de datos, archivo, etc
            }
        }
        //para que continúe el ciclo request/response, llama a la cadena
        //lo que en realidad hace es llamar al siguiente Filter
        //que puede aplicar para este ciclo request/response
        //si no hay más instancias de Filter, entonces se ejecuta el request
        //esto es independiente de si se ejecuta GET, POST, etc
        chain.doFilter(req, res);
    }

    @Override
    public void destroy() {
        //
    }
}
    
answered by 22.11.2016 / 15:50
source
1

Sorry to not provide examples in code but you can use the Storage html5 (session or local) to save all the events in the client and when you make a request to the server you send that data structure. This way you will have more complete data, just as you asked in your question initially.

    
answered by 22.11.2016 в 22:54