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

  • 相关阅读:
    Java 第十一届 蓝桥杯 省模拟赛 梅花桩
    Java 第十一届 蓝桥杯 省模拟赛 梅花桩
    Java 第十一届 蓝桥杯 省模拟赛 梅花桩
    Java 第十一届 蓝桥杯 省模拟赛 元音字母辅音字母的数量
    Java 第十一届 蓝桥杯 省模拟赛 元音字母辅音字母的数量
    Java 第十一届 蓝桥杯 省模拟赛 元音字母辅音字母的数量
    Java 第十一届 蓝桥杯 省模拟赛 最大的元素距离
    Java 第十一届 蓝桥杯 省模拟赛 递增序列
    Java 第十一届 蓝桥杯 省模拟赛 递增序列
    Java 第十一届 蓝桥杯 省模拟赛 最大的元素距离
  • 原文地址:https://www.cnblogs.com/xiaoxian1369/p/4233879.html
Copyright © 2011-2022 走看看