WebのListener【Listener】とフィルタ【Filter】の例

6773 ワード

Listenerインスタンス:
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