Web中的监听器【Listener】与过滤器【Filter】 实例
监听器实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | package com.gwssi.listener; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class SessionListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent event) { HttpSession session = event.getSession(); SessionBean sessionBean = SessionFactory.getInstance().getSessionBean(); System.out.println( "sessionCreated session: " + (session.getId())); System.out.println( "sessionCreated accessCount: " + (sessionBean.getAccessCount())); // 访问次数 sessionBean.setAccessCount(sessionBean.getAccessCount() + 1 ); // 在线人数统计 sessionBean.getOnline().put(session.getId(), null ); } @Override public void sessionDestroyed(HttpSessionEvent event) { HttpSession session = event.getSession(); SessionFactory factory = SessionFactory.getInstance(); SessionBean sessionBean = factory.getSessionBean(); System.out.println( "sessionDestroyed session: " + (session.getId())); System.out.println( "sessionDestroyed accessCount: " + (sessionBean.getAccessCount())); factory.removeLogin(session); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | package com.gwssi.listener; import javax.servlet.http.HttpSession; public class SessionFactory { private SessionBean sessionBean = new SessionBean(); private static SessionFactory factory; private SessionFactory() { } static { factory = new SessionFactory(); } public synchronized static SessionFactory getInstance() { if (factory == null ) { factory = new SessionFactory(); } return factory; } public void addLogin(HttpSession session, String user) { this .getSessionBean().getOnline().put(session.getId(), user); this .getSessionBean().getLogin().add(user); } public void removeLogin(HttpSession session) { this .getSessionBean().getLogin() .remove( this .getSessionBean().getOnline().get(session.getId())); this .getSessionBean().getOnline().remove(session.getId()); } public boolean isOnline(String user) { return this .getSessionBean().getLogin().contains(user); } public SessionBean getSessionBean() { return sessionBean; } public void setSessionBean(SessionBean sessionBean) { this .sessionBean = sessionBean; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | package com.gwssi.listener; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; public class SessionBean { private Map<String, String> online = new HashMap<String, String>(); private int accessCount = 0 ; private Set<String> login = new HashSet<String>(); /** * * 返回当前系统在线人数 * * @return int */ public int getOnlineCount() { return this .online.size(); } /** * 返回当前系统登录人数 * * @return int */ public int getLoginCount() { return this .getLogin().size(); } public Map<String, String> getOnline() { return online; } public void setOnline(Map<String, String> online) { this .online = online; } public int getAccessCount() { return accessCount; } public void setAccessCount( int accessCount) { this .accessCount = accessCount; } public Set<String> getLogin() { return login; } public void setLogin(Set<String> login) { this .login = login; } } |
在web.xml中增加
1 2 3 4 5 6 7 | <session-config> <session-timeout> 10 </session-timeout> </session-config> <listener> <listener- class >com.gwssi.listener.SessionListener</listener- class > </listener> |
在登录时
1 2 | //添加进入SessionFactory,以供记录是否在线 SessionFactory.getInstance().addLogin(session, userInfo.getUserId()); |
页面调用:
import="com.oddel.listener.SessionFactory;
SessionFactory.getInstance().isOnline(userid)
返回true表示用户当前是在线的。
返回false表示用户当前是不在线的。
参考博客:
http://www.cnblogs.com/sherryueda/p/4273169.html
过滤器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | package com.gwssi.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import cn.gwssi.csdb.fbk.util.StringUtil; public class SessionCheckFilter implements Filter { @Override public void destroy() { } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; String userid = request.getParameter( "userid" ); // System.out.println(request.getServletPath() + "===SessionCheckFilter====" + userid); if (StringUtil.isEmpty(userid) || "null" .equals(userid)) { // 当请求中没有userid参数时,由后台进行判断 chain.doFilter(req, res); } else { HttpSession session = request.getSession(); UserInfo userInfo = (UserInfo) session.getAttribute( "userInfo" ); HttpServletResponse response = (HttpServletResponse) res; if (userInfo == null ) { // session过期 redirect(request, response); } else { System.out.println(userInfo.getUserId() + "========" + userid); if (userid.equals(userInfo.getUserId())) { chain.doFilter(req, res); } else { // 登录名不一致 redirect(request, response); } } } } private void redirect(HttpServletRequest request, HttpServletResponse response) throws IOException { String requestType = request.getHeader( "X-Requested-With" ); if (requestType != null && requestType.equals( "XMLHttpRequest" )) { response.setStatus(HttpServletResponse.SC_FORBIDDEN); } else { String href = request.getContextPath() + "/pages/sessionTimeOut.jsp" ; response.sendRedirect(href); } } @Override public void init(FilterConfig config) throws ServletException { } } |
在web.xml中
1 2 3 4 5 6 7 8 9 | <filter> <filter-name>sessionCheckFilter</filter-name> <filter- class >com.gwssi.csdb.fbk.authority.SessionCheckFilter</filter- class > </filter> <filter-mapping> <filter-name>sessionCheckFilter</filter-name> <url-pattern>*. do </url-pattern> </filter-mapping> |
参考博客:
http://www.cnblogs.com/sherryueda/p/4275805.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步