Java – finds the number of active sessions created from a given client IP

Is there a way to determine the number of active sessions created from a given client IP address?

Solution

The standard servlet API does not provide such facilities The best way is to maintain a map < httpsession, string > (where string is the IP address), check httpsession #isnew() on each ServletRequest, and add it to the map together with ServletRequest #getremoteaddr() You can then use collections #frequency () in map #values () using an active session You just need to ensure that httpsession is removed from the map during httpsessionlistener#sessiondestroyed()

All this can be done in a single listener that implements servletcontextlistener, httpsessionlister, and ServletRequestListener

This is an example of a kick-off:

public class SessionCounter implements servletcontextlistener,HttpSessionListener,ServletRequestListener {

    private static final String ATTRIBUTE_NAME = "com.example.SessionCounter";
    private Map<HttpSession,String> sessions = new ConcurrentHashMap<HttpSession,String>();

    @Override
    public void contextInitialized(ServletContextEvent event) {
        event.getServletContext().setAttribute(ATTRIBUTE_NAME,this);
    }

    @Override
    public void requestInitialized(ServletRequestEvent event) {
        HttpServletRequest request = (HttpServletRequest) event.getServletRequest();
        HttpSession session = request.getSession();
        if (session.isNew()) {
            sessions.put(session,request.getRemoteAddr());
        }
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        sessions.remove(event.getSession());
    }

    @Override
    public void sessionCreated(HttpSessionEvent event) {
        // NOOP. Useless since we can't obtain IP here.
    }

    @Override
    public void requestDestroyed(ServletRequestEvent event) {
        // NOOP. No logic needed.
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        // NOOP. No logic needed. Maybe some future cleanup?
    }

    public static SessionCounter getInstance(ServletContext context) {
        return (SessionCounter) context.getAttribute(ATTRIBUTE_NAME);
    }

    public int getCount(String remoteAddr) {
        return Collections.frequency(sessions.values(),remoteAddr);
    }

}

On the web XML is defined as follows:

<listener>
    <listener-class>com.example.SessionCounter</listener-class>
</listener>

You can use it in any servlet, as follows:

SessionCounter counter = SessionCounter.getInstance(getServletContext());
int count = counter.getCount("127.0.0.1");
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>