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>
时间: 2024-10-08 01:56:54

Web中的监听器【Listener】与过滤器【Filter】的相关文章

Web中的监听器【Listener】

Servlet监听器:Servlet规范中定义的一种特殊类,它用于监听Web应用程序中的ServletContext.HttpSession和ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件. ServeltContextListener接口: 其用于监听ServletContext对象的创建和销毁事件. 当ServletContext对象被创建时,激发contextInitialized(ServletContextEvent sce)方法 当Se

【JAVA 核心技术】java web 中的监听器

为什么要有监听器? 监听器是用来处理一系列事件的java类,可被配置在java web项目中. 既然如此,为什么不用代码直接调用监听器? 这可能是因为J2EE规范规定的项目工程标准,用web.xml指定监听器, 然后服务器中间件如weblogic可以以遵照标准,读取web.xml, 运行监听器处理指定的事件. 这样,listener,servlet是类似的规范. 为什么要有web.xml? web.xml可以方便(也许不)地修改工程中用到的监听器. 这种东西像不像触发器或者轮询进程?如果像,它跟

java中的监听器(listener)

监听器在java应用中比较广泛,记得web启动的时候的监听器吗,记得spring配置中的监听器吗?,记得消息传输中的监听器吗? 没错,这就是listener的应用,无处不在,身为一个java程序员,你如果不懂的监听器的原理是不是很可悲啊,没错我感觉挺可悲的(因为我刚刚才了解到监听器的工作原理), 为了纪念自己取得的一点小小的success,写篇博文记录一下自己的一些不成熟的意见和理解 监听器,就我理解就和我们日常生活中的原始概念一样,就是监听事物的一些行为.举个例子,抗战时期,发现一个国民党特务

好记性不如烂笔头34-java应用中的监听器Listener(1)

监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动.监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行. 在很多的地方,很多的行为,都需要去监听.比如我们有一辆汽车,汽车点火之后,我们要检查汽车的各项状态:汽车开动之后,要做一些处理,这些都可以通过监听去实现. 我们如果想设计一个汽车,让这个汽车的各种状态可以被别

java web中get请求中文乱码在filter中解决

之前已经讲过get或者post方法的中文乱码问题,之前都是在每个方法中编写设置编码.如果程序变大,就会很繁琐,使用filter可以避免这种繁琐. 1)写一个encodingFilter进行编码设置 public class encodingFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain arg2) throws IOExce

web.xml之context-param,listener,filter,servlet加载顺序及其周边

先以加载spring为例子看看加载顺序的作用: Spring加载可以利用ServletContextListener 实现,也可以采用load-on-startup Servlet 实现,但比如filter 需要用到 bean ,但加载顺序是: 先加载filter 后加载spring,则filter中初始化操作中的bean为null:所以,如果过滤器中要使用到 bean,此时就可以根据加载顺序listener>filter>servlet,将spring 的加载 改成 Listener的方式.

web.xml 之contextParam,listener,filter,servlet的加载顺序

先以加载spring为例子看看加载顺序的作用: Spring加载可以利用ServletContextListener 实现,也可以采用load-on-startup Servlet 实现,但比如filter 需要用到 bean ,但加载顺序是: 先加载filter 后加载spring,则filter中初始化操作中的bean为null:所以,如果过滤器中要使用到 bean,此时就可以根据加载顺序listener>filter>servlet,将spring 的加载 改成 Listener的方式.

12.listener(了解)和filter(掌握)

Listener: ### 监听器(了解) ### ---------- **监听器的概述** 1.概述:监听器是一个Java的类,监听另一个Java类状态的改变. 2.监听器的概念 * 事件源 -- 被监听的对象(电动车) * 监听器 -- 监听的对象(报警器) * 绑定监听器 -- 在被监听的对象上,注册一个监听器(在电动车上安装报警器) * 事件 -- 一旦事件源的状态发生了改变,创建一个事件的对象,传递给监听器的对象,监听器对象中的某一个方法就会执行了. * 一旦电动车被踢了,产生一个事

网站过滤器Filter

实际上,Filter与Servlet及其相似,区别只是FIlter的doFilter()方法里多了一个FilterChain的参数,通过该参数可以控制是否放行用户的请求.网站有了过滤器十分的方便,可以通过过滤器来过滤这个用户是否已经登陆,如果没有登陆,那么将限制TA的访问权限,而且过滤器的设置以及配置都比较简单.下面通过一个登陆过滤器的代码简单说一下过滤器的使用: /** *登陆过滤器 */ public class LoginFilter implements Filter { @Overri