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表示用户当前是不在线的。

 

过滤器:

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>
    

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。