zoukankan      html  css  js  c++  java
  • 监听器和过滤器

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

  • 相关阅读:
    vm virtualBox下 centos7 Linux系统 与本地 window 系统 网络连接 配置
    ArrayList的扩容机制
    如何在Anaconda中实现多版本python共存
    安装selenium和chromedriver
    python中安装pandas
    C#解析数组形式的json数据
    angular学习总结
    echarts实现环形图
    echarts实现折线图
    angular安装记录
  • 原文地址:https://www.cnblogs.com/NCL--/p/7446068.html
Copyright © 2011-2022 走看看