监听器和过滤器

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
 *
 */
@WebListener
public 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中配置的时候相比, 有一个缺点, 无法确定监听器的加载顺序

原文地址:https://www.cnblogs.com/NCL--/p/7446068.html