监听器和过滤器

来源:互联网 发布:人工智能政策 编辑:程序博客网 时间:2024/06/03 02:27

index中:

当前的在线人数:<%=application.getAttribute("userCount") %>

监听器中设置数据时,名字要相同

session.getServletContext().setAttribute("userCount", userCount);session.getServletContext().setAttribute("userList", userList);

toString方法重写,日期显示我们日常所见的日期模式

public String toString() {return "User [username=" + username + ", 最近登录时间="+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(loginTime) + "]";}

session监听器中的创建对象:

//创建session对象HttpSession session=SessionEvent.getSession();String username=session.getId();//session.getId();是session的唯一标识long loginTime=session.getCreationTime();//session.getCreationTime();获取session的创建时间
<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>    <%@ page import="java.util.List,java.util.ArrayList,com.hanqi.Dal.User" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body>    <h1>首页</h1><hr>当前的在线人数:<%=application.getAttribute("userCount") %><hr>用户列表:<hr><%    List<User> userlist=(List<User>)application.getAttribute("userlist");    if(userlist!=null){            for(User a:userlist){                out.print(a+"<br>");            }        }%></body></html>
package com.hanqi.Listener;import java.sql.Date;import java.util.ArrayList;import java.util.Iterator;import javax.servlet.annotation.WebListener;import javax.servlet.http.HttpSession;import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;import com.hanqi.Dal.User;/** * Application Lifecycle Listener implementation class TextSessionLisenter * */@WebListenerpublic class TextSessionLisenter implements HttpSessionListener {    private int userCount;    public ArrayList<User> userlist;    /**     * Default constructor.      */    public TextSessionLisenter() {           }    /**     * @see HttpSessionListener#sessionCreated(HttpSessionEvent)     */    public void sessionCreated(HttpSessionEvent SessionEvent)  {         userCount++;        System.out.println(userCount);        //判断userlist集合是否为空        if(userlist==null){            //是空的,实例化一个            userlist=new ArrayList<User>();                  }        //创建session对象        HttpSession session=SessionEvent.getSession();        String username=session.getId();//session.getId();是session的唯一标识        long loginTime=session.getCreationTime();//session.getCreationTime();获取session的创建时间        if(!CheckPram(username,userlist)){            User u=new User();            u.setUsername(username);            u.setLoginTime(new Date(loginTime));            userlist.add(u);        }        session.getServletContext().setAttribute("userCount", userCount);        session.getServletContext().setAttribute("userlist", userlist);            }    /**     * @see HttpSessionListener#sessionDestroyed(HttpSessionEvent)     */    public void sessionDestroyed(HttpSessionEvent SessionEvent)  {         userCount--;        //创建session对象        HttpSession session =SessionEvent.getSession();        String username=session.getId();        System.out.println(username+"下线了");        if(CheckPram(username,userlist)){            //迭代器遍历            Iterator<User> iter=userlist.iterator();            while(iter.hasNext()){                User u=iter.next();                if(u.getUsername().equals(iter)){                    iter.remove();                }            }        }        session.getServletContext().setAttribute("userCount", userCount);        session.getServletContext().setAttribute("userlist", userlist);    }    public boolean CheckPram(String username,ArrayList<User> list){        for(User u:list){            if(username.equals(list)){                return true;            }        }        return false;    }}

监听器

package com.haiqi.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;public class SessionFilter implements Filter {    private String pages;    @Override    public void destroy() {        // TODO Auto-generated method stub            }    @Override    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)            throws IOException, ServletException {        HttpServletRequest request=(HttpServletRequest) req;        HttpServletResponse response=(HttpServletResponse) resp;        //获取请求        String url=request.getRequestURI();        System.out.println("当前发送的请求"+url);        //获取不需要判断的session        String[] _page=pages.split(";");        //判断请求是否存在不需要判断的请求中        if(Check(_page,url)){            //放行            chain.doFilter(req, resp);        }else{            //接受session            Object ob=request.getSession().getAttribute("currentUser");            //判断session是否为空            if(ob==null){                response.sendRedirect("Login.jsp");            }else{                chain.doFilter(req, resp);            }        }            }        public static boolean Check(String[] page,String url){        for(String s:page){            if(url.contains(s)){                return true;            }        }        return false;    }    @Override    public void init(FilterConfig config) throws ServletException {        String str=config.getInitParameter("page");        this.setPages(str);        System.out.println(str);            }    public String getPages() {        return pages;    }    public void setPages(String pages) {        this.pages = pages;    }    }
package com.hanqi.Servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class LoginServlet */@WebServlet("/LoginServlet")public class LoginServlet extends HttpServlet {    private static final long serialVersionUID = 1L;           /**     * @see HttpServlet#HttpServlet()     */    public LoginServlet() {        super();        // TODO Auto-generated constructor stub    }    /**     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)     */    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {            String username =request.getParameter("username");            String password=request.getParameter("password");                        if("admin".equals(username)&&"12345".equals(password)){                request.getSession().setAttribute("currentUser","admin");//在session里面存储用户名                response.sendRedirect("index.jsp");            }else{                response.sendRedirect("fail.jsp");            }    }    /**     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)     */    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        // TODO Auto-generated method stub        doGet(request, response);    }}

 


过滤器链:
不同的请求互不影响
过滤器链主要是针对多个过滤器过滤同一个url请求
过滤器的先后顺序是按照在web.xml的配置顺序来的
运行顺序: 请求--->过滤器1过滤--->过滤器2过滤--->后台处理层--->过滤器2过滤--->过滤器1过滤--->客户端接收

3.0新特性的过滤器:
使用注解的方式:
@WebFilter(filterName="", value={"",""}...等其他配置)

 

监听器: 运行在服务器段的程序, 主要用于监听request, application, session这三个对象, 比如这三个对象的创建和销毁, 修改属性等一系列的操作
监听器的配置
创建类实现关于监听器的那些接口
public class TestListener implements ...Listener... {
...实现其中的方法
}

web.xml中的配置
<listener>
<listener-class>定义监听器的类的全路径名</listener-class>
</listener>

使用注解的方式:
@WebListener写在类名的上面

多个监听器的加载顺序
按照web.xml的配置顺序来加载各个监听器
如果在web.xml中配置有监听器, 过滤器, Servlet时, 他们的优先级分别为
监听器 > 过滤器 > Servlet

ServletContext对象的监听
在web.xml中有这样一个标签:
<context-param>
<param-name>初始化的参数名</param-name>
<param-value>初始化的参数值</param-value>
</context-param>

在监听器中可以使用参数对象来获取这个初始化参数
String value = applicationEvent.getServletContext().getInitParameter("hanqi");
HttpSession对象的监听
session在一个用户第一次访问这个页面的时候被创建, session的实例可以创建多个, 有一个用户访问, 就会创建一个session
回忆一下session的过期时间怎么配置
用途: 统计在线人数, 网站的用户访问量

HttpServletRequest对象的监听
只要有请求发送过来, 就会执行监听器中的init()方法和destory()方法
用途: 读取参数, 记录访问历史

3.0版本之后的监听器只需要加上一个@WebListenner注解就可以使用, 但是跟之前在web.xml中配置的时候相比, 有一个缺点, 无法确定监听器的加载顺序

 

原创粉丝点击