zoukankan      html  css  js  c++  java
  • Web中的监听器【Listener】与过滤器【Filter】 实例

    监听器实例:

    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);
    	}
    
    }
    
    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;
    	}
    
    }
    
    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中增加

     <session-config>
            <session-timeout>10</session-timeout>
        </session-config>
        
        <listener>
        	<listener-class>com.gwssi.listener.SessionListener</listener-class>
        </listener>
    

    在登录时

    	//添加进入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

    过滤器:

    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中

    <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

  • 相关阅读:
    【转】详解 ASP.NET异步
    [转]C# Unity使用
    [转载]C# 温故而知新:Stream篇
    [转]SQL Server 2008带字段注释导入Power Designer 9.5
    SOAOffice控件
    【转】javascript 杂谈之哪种写法你更喜欢?
    【转】提搞网站访问速度的可做哪些优化
    用vs.NET创建Windows服务
    利用IIS的404错误将文件重写成目录的简单方法
    【转】寻找成为开发高手的密匙
  • 原文地址:https://www.cnblogs.com/xiaoxian1369/p/4233879.html
Copyright © 2011-2022 走看看