zoukankan      html  css  js  c++  java
  • 【Java EE 学习 20】【使用过滤器实现登陆验证、权限认证】【观察者模式和监听器(使用监听器实现统计在线IP、登录IP 、踢人功能)】

    一、使用过滤器实现登录验证、权限认证

      1.创建5张表

    /*使用过滤器实现权限过滤功能*/
    
    /**创建数据库*/
    DROP DATABASE day20;
    CREATE DATABASE day20;
    USE DAY20;
    /*用户表*/
    DROP TABLE IF EXISTS USER;
    CREATE TABLE USER(
        userid VARCHAR(32) ,
        username VARCHAR(32),
        userpassword VARCHAR(32),
        CONSTRAINT pk_userid  PRIMARY KEY (userid)
    );
    /*角色表*/
    CREATE TABLE role(
        roleid VARCHAR(32),
        rolename VARCHAR(32),
        roledes VARCHAR(120),/*角色分配的菜单????*/
        CONSTRAINT pk_roleid PRIMARY KEY(roleid)
    );
    
    
    /*创建菜单表*/
    CREATE TABLE menu(
        menuid VARCHAR(32),
        menuname VARCHAR(32),
        menuurl VARCHAR(32),
        CONSTRAINT pk_menuid PRIMARY KEY (menuid)
    );
    
    /*开始创建中间表*/
    
    /*创建userrole中间表*/
    CREATE TABLE userrole(
        userid VARCHAR(32),
        roleid VARCHAR(32),
        CONSTRAINT pk_userrole PRIMARY KEY(userid,roleid),
        CONSTRAINT fk_userid FOREIGN KEY(userid) REFERENCES USER(userid),
        CONSTRAINT fk_roleid FOREIGN KEY(roleid) REFERENCES role(roleid)
    );
    
    /*创建rolemenu中间表*/
    CREATE TABLE rolemenu(
      menuid VARCHAR(32),
      roleid VARCHAR(32),
      CONSTRAINT rm_pk PRIMARY KEY(menuid,roleid),
      CONSTRAINT rm_fk1 FOREIGN KEY(menuid) REFERENCES menu(menuid),
      CONSTRAINT rm_fk2 FOREIGN KEY(roleid) REFERENCES role(roleid)
    )
    INSERT INTO USER VALUES('U001','Jack','1234');
    INSERT INTO USER VALUES('U002','张三','4321');
    INSERT INTO USER VALUES('U003','Tom','1111');
    
    INSERT INTO role VALUES('R001','管理员','');
    INSERT INTO role VALUES('R002','教师','');
    
    INSERT INTO userrole VALUES('U001','R001');
    INSERT INTO userrole VALUES('U002','R002');
    
    INSERT INTO menu VALUES('M001','系统管理','/sys.jsp');
    INSERT INTO menu VALUES('M002','用户管理','/user.jsp');
    INSERT INTO menu VALUES('M003','角色管理','/role.jsp');
    
    INSERT INTO rolemenu VALUES('M001','R001');
    INSERT INTO rolemenu VALUES('M002','R001');
    INSERT INTO rolemenu VALUES('M003','R001');
    INSERT INTO rolemenu VALUES('M003','R002');
    创建5张表并初始化数据

      ER图:

      2.sql查询准备

        (1)查找所有用户对应的角色信息

    SELECT u.username,r.rolename FROM USER u 
        INNER JOIN userrole ur ON u.userid=ur.userid
        INNER JOIN  role r ON r.roleid=ur.roleid;

        (2)查找所有角色对应的管理菜单

    SELECT r.rolename,m.menuname FROM role r 
        INNER JOIN rolemenu rm ON r.roleid=rm.roleid
        INNER JOIN menu m ON rm.menuid=m.menuid;

        (3)查找所有用户对应的管理菜单

    SELECT u.username,m.menuname FROM USER u
        INNER JOIN userrole ur ON u.userid=ur.userid
        INNER JOIN role r ON ur.roleid=r.roleid
        INNER JOIN rolemenu rm ON r.roleid=rm.roleid
        INNER JOIN menu m ON rm.menuid=m.menuid;

        3.注意:在使用过滤器进行权限认证的时候最重要的是sql的写法,即最重要的是数据库查询部分

        4.过滤器

          (1)登陆验证过滤器:首先验证是否已经登陆,如果没有登录的话,首先需要登陆,在web.xml文件中配置的时候要放在所有认证过滤器的前面。

           示例代码:

    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 LoginFilter implements Filter {
    
        public void init(FilterConfig filterConfig) throws ServletException {
            // TODO Auto-generated method stub
            
        }
    
        public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException {
            HttpServletRequest req = (HttpServletRequest) request;
            if(req.getSession().getAttribute("user")==null){
                System.err.println("用户还没有登录");
                HttpServletResponse resp = (HttpServletResponse) response;
                resp.sendRedirect(req.getContextPath()+"/index.jsp?error=2");
            }else{
                chain.doFilter(req, response);
            }
        }
    
        public void destroy() {
            // TODO Auto-generated method stub
            
        }
        
    }
    登录验证过滤器

          (2)权限认证过滤器:如果用户已经登陆(登陆验证过滤器负责),而且想要访问权限不够的资源,比如教师想要进行系统管理,因为教师没有系统管理的权限,所以系统应当拦截该请求并警醒错误提示。

           示例代码:

    package cn.itcast.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 org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.handlers.ScalarHandler;
    
    import cn.itcast.domain.User;
    import cn.itcast.utils.DataSourceUtils;
    
    public class AuthFilter implements Filter {
    
        public void init(FilterConfig filterConfig) throws ServletException {
            // TODO Auto-generated method stub
            
        }
    
        public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException {
            //获取uri
            HttpServletRequest req = (HttpServletRequest) request;
            String uri = req.getRequestURI();//Http://localhost:8080/day20/jsps/role.jsp->day20/jsps/role.jsp
            uri = uri.replace(req.getContextPath(), "");
            //组成sql
            String sql = "SELECT COUNT(1)"+
                         " FROM menus m INNER JOIN rolemenu rm ON m.id=rm.mid"+
                         " INNER JOIN roles r ON r.id=rm.rid"+
                         " INNER JOIN roleuser ru ON r.id=ru.rid"+
                         " WHERE ru.uid=? AND url=?";
            //取到用户的id
            User user = (User) req.getSession().getAttribute("user");
            try{
                QueryRunner run = new QueryRunner(DataSourceUtils.getDatasSource());
                Object o = run.query(sql,new ScalarHandler(),user.getId(),uri);
                int size = Integer.parseInt(o.toString());
                if(size==0){
                    System.err.println("你没有权限....");
                }else{
                    chain.doFilter(req, response);
                }
                
            }catch(Exception e){
                
            }
        }
    
        public void destroy() {
            // TODO Auto-generated method stub
        }
        
    }
    权限认证过滤器

    二、观察者模式

      1.监听器存在三个对象

        (1)监听者:XxxxListener        

                            一般是一个接口

        (2)被监听者             

                            任意对象都能成为被监听者

        (3)监听到的事件:XxxxEvent

                            永远是一个具体类,用来放监听到的数据,永远都会有一个方法getSource,该方法返回被监听的对象

      2.观察者模式

        (1)java Web中的所有监听器使用的都是观察者模式

        (2)观察者模式模拟

          awt编程模拟:

    public class MyFrame extends JFrame {
        public MyFrame() {
            JButton btn = new JButton("你好");
            System.err.println("btn: is:"+btn.hashCode());
            btn.addActionListener(new MyListener());
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            //获取容器
            Container con= getContentPane();
            //设置布局
            con.setLayout(new FlowLayout());
            con.add(btn);
            
            setSize(300, 300);
            setVisible(true);
        }
        public static void main(String[] args) {
            new MyFrame();
        }
        //实现一个监听者
        class MyListener implements ActionListener{
            //监听方法
            public void actionPerformed(ActionEvent e) {
                System.err.println("我监听到了:"+e.getSource().hashCode());
            }
        }
    }
    JFrame按钮单击监听

        (3)观察者模式分析:自己模拟一个观察者模式

         模拟监听某人跑步的动作,一旦监听到被监听者有跑步的动作就要有通知告知被监听者跑步了!

    package com.kdyzm.ObserverModel;
    //测试观察者模式
    public class Main {
        public static void main(String args[])
        {
            Person p=new Person();
            p.addPersonListener(new PersonListener(){
                @Override
                public void doListen(PersonEvent e) {
                    System.out.println("被监听到正在跑步!");
                    throw new RuntimeException("他正在跑步!!!");
                }
            });
            p.run();
        }
    }
    interface PersonListener
    {
        void doListen(PersonEvent e);
    }
    class PersonEvent
    {
        Person p=null;
        public PersonEvent(Person p)
        {
            this.p=p;
        }
        public Person getSource()
        {
            return p;
        }
    }
    
    class Person
    {
        PersonListener listener=null;
        public void addPersonListener(PersonListener listener)
        {
            //完成传递监听器的过程。
            this.listener=listener;
        }
        public void run()
        {
            //被监听者只要有动作,监听器也跟着一起动
            if(listener!=null)//如果不加监听器的话也要能够正常“跑步”
            {
                listener.doListen(new PersonEvent(this));
            }
            System.out.println("我正在跑步!");
        }
    }
    观察者模式模拟代码

    三、监听器

      1.java web中存在三个被监听对象

        (1)HttpServletRequest

        (2)HttpSession

        (3)ServletContext

      2.监听者

    监听者

    被监听者

    监听到事件对象

    HttpSessionActivationListener

    HttpSession – 监听HttpSession活化和顿化。

    HttpSessionEvent 

    HttpSessionAttributeListener[W1] 

    HttpSession – 监听session的属性变化的。S.setAttributee();

    HttpSessionBindingEvent 

    HttpSessionBindingListener

    HttpSession - 监听哪一个对象,绑定到了session上。S.setAtrri(name,User);

    HttpSessionListener[W2] 

    HttpSesion – 监听sessioin创建销毁

    HttpSessionEvent

    ServletContextAttributeListener

    ServletContext – 属性变化的

    ServletContextListener

    servletContext 创建销毁

    ServletRequestListener - serlvetRequestAttibuteListner

    Rrequest -创建销毁

     四、监听HttpServletRequest的创建和销毁

      1.一个基本的监听器实现

        第一步:实现一个接口ServletRequestListener,该接口提供了两个方法可以监控Request的创建和销毁。

    Method Summary

     void

    requestDestroyed(ServletRequestEvent sre)
              Receives notification that a ServletRequest is about to go out of scope of the web application.

     void

    requestInitialized(ServletRequestEvent sre)
              Receives notification that a ServletRequest is about to come into scope of the web application.

       创建的类:

    package com.kdyzm.listener;
    
    import javax.servlet.ServletRequestEvent;
    import javax.servlet.ServletRequestListener;
    public class RequestListener implements ServletRequestListener {
    
        @Override
        public void requestDestroyed(ServletRequestEvent sre) {
            Object request=sre.getSource();
            System.out.println(request+"被创建!");
        }
    
        @Override
        public void requestInitialized(ServletRequestEvent sre) {
            Object request=sre.getSource();
            System.out.println(request+"被销毁!");
        }
    }
    实现了ServletRequestListener接口的类

      第二步:在web.xml文件中进行配置

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="3.0"
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
        
        <listener>
            <listener-class>com.kdyzm.listener.RequestListener</listener-class>
        </listener>
    </web-app>
    在web.xml文件中的配置

      第三步:通过浏览器向服务器发起请求,如请求默认的index.jsp页面,可以得到该请求对象被创建的时间和该请求对象被销毁的时间。

         说明:

           (1):配置一个Listener只要求提供类名就可以了。

           (2):在tomcat启动时,会自动的初始化这个监听器类。

           (3):tomcat创建的Listner,Serlvet,Filter都是单列的.

    五、通过HttpSessionListener监视器实现记录在线人数的功能

      1.API

    Method Summary

     void

    sessionCreated(HttpSessionEvent se)
              Receives notification that a session has been created.

     void

    sessionDestroyed(HttpSessionEvent se)
              Receives notification that a session is about to be invalidated.

       2.实现记录在线人数的功能,不仅显示人数,还要将所有在线的人ip地址输出出来,通过配置web.xml设置session的存活时间。

        具体小练习:https://github.com/kdyzm/day20_2

      小练习结果:

    org.apache.catalina.session.StandardSessionFacade@19815db session被创建!
    C35F7D7FE6B48813E79FD6DB2DC23386 退出!
    org.apache.catalina.session.StandardSessionFacade@f6ae8f session被创建!
    org.apache.catalina.session.StandardSessionFacade@10ecfa session被创建!
    org.apache.catalina.session.StandardSessionFacade@1362188 session被创建!
    org.apache.catalina.session.StandardSessionFacade@d38409 session被创建!
    org.apache.catalina.session.StandardSessionFacade@818d25 session被创建!
    org.apache.catalina.session.StandardSessionFacade@1599f60 session被创建!
    org.apache.catalina.session.StandardSessionFacade@ee7f4c session被创建!
    E4FEA09EC547D15DEF3C4B13B1327985 退出!
    org.apache.catalina.session.StandardSessionFacade@86aa0c session被创建!
    21FE11469F2F5C2DECF8AB32F0F18B96 退出!
    6BEB338728B16829FB39B693238ADDE3 退出!
    F71C51D49A900B3B9C5819D467136970 退出!
    CA402FF768C14972F6E3358B27E4DA2D 退出!
    ACE87998C0EAA62B2C9332FFBC31EA60 退出!
    53A1FFC5F2A80A1EFDD38172C0632CAA 退出!
    C6BF0DF4E7042FBEBDC51192ABA3BD7F 退出!

    浏览器显示示例:

    六、使用HttpSessionAttributeListener监听HttpSession中的属性变化。

      1.API

    Method Summary

     void

    attributeAdded(HttpSessionBindingEvent event)
              Receives notification that an attribute has been added to a session.

     void

    attributeRemoved(HttpSessionBindingEvent event)
              Receives notification that an attribute has been removed from a session.

     void

    attributeReplaced(HttpSessionBindingEvent event)
              Receives notification that an attribute has been replaced in a session.

       2.具体用法配置略(小练习七会用到该接口)。

    七、小练习:

      要求:

        1.显示所有登陆人数

        2.登录人的ip、还要现实创建session的时间、最后访问的时间

        3.管理员:可以踢出某个用户

      1.项目源代码https://github.com/kdyzm/day20_3

      2.核心类:

        (1)监听器1个(实现HttpSessionAttributeListener接口)

    package com.kdyzm.listener;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpSession;
    import javax.servlet.http.HttpSessionAttributeListener;
    import javax.servlet.http.HttpSessionBindingEvent;
    
    public class SessionAttributeListener implements HttpSessionAttributeListener {
    
        @Override
        public void attributeAdded(HttpSessionBindingEvent event) {
            String attributename=event.getName();
            if(attributename.equals("user"))
            {
                System.out.println(event.getName()+"新属性被添加!"+event.getValue());
                String attributevalue=event.getValue().toString();
                ServletContext sc=event.getSession().getServletContext();
                Map<String,HttpSession>map=(Map<String, HttpSession>) sc.getAttribute("map");
                if(map==null)
                {
                    map=new HashMap<String,HttpSession>();
                    sc.setAttribute("map", map);
                }
                map.put(attributevalue, event.getSession());
            }
        }
    
        @Override
        public void attributeRemoved(HttpSessionBindingEvent event) {
            String name=event.getName();
            System.out.println("有属性被移除!"+name+":"+event.getValue());
            if(name.equals("user"))
            {
                ServletContext sc=event.getSession().getServletContext();
                String value=event.getValue().toString();
                Map<String,HttpSession> map=(Map<String, HttpSession>) sc.getAttribute("map");
                map.remove(value);
            }
        }
    
        @Override
        public void attributeReplaced(HttpSessionBindingEvent event) {
        }
        
    }
    SessionAttributeListener.java

        (2)过滤器两个(实现Filter接口)

          [1]登陆过滤器: 

    package com.kdyzm.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 LoginFilter implements Filter {
    
        @Override
        public void destroy() {
        }
    
        @Override
        public void doFilter(ServletRequest req, ServletResponse resp,
                FilterChain chain) throws IOException, ServletException {
            HttpServletRequest request=(HttpServletRequest) req;
            HttpServletResponse respose=(HttpServletResponse) resp;
            if(request.getSession().getAttribute("user")==null)
            {
                System.out.println("用户还没有登录!");
                respose.sendRedirect(request.getContextPath()+"/index.jsp");
            }
            else
            {
                chain.doFilter(request, resp);
            }
        }
    
        @Override
        public void init(FilterConfig arg0) throws ServletException {
        }
    
    }
    LoginFilter.java

          [2]获取请求ip的过滤器

    package com.kdyzm.filter;
    //拦截请求并从请求信息中获取ip信息将信息保存到session中
    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.HttpSession;
    
    public class SessionSetIpFilter implements Filter {
    
        @Override
        public void destroy() {
        }
    
        @Override
        public void doFilter(ServletRequest req, ServletResponse response,
                FilterChain chain) throws IOException, ServletException {
            HttpServletRequest request=(HttpServletRequest) req;
            if(request.getSession().getAttribute("ip")==null)
            {
                String ip=request.getRemoteAddr();
                System.out.println("有新用户访问!ip="+ip);
                HttpSession session=request.getSession();
                session.setAttribute("ip", ip);
            }
            chain.doFilter(request, response);
        }
        @Override
        public void init(FilterConfig arg0) throws ServletException {
        }
    
    }
    SessionSetIpFilter

        (3)Servlet2个:

          [1]将存放Map<String,HttpSession>对象转换成List<Map<String,String>>对象的转换Servlet

    package com.kdyzm.servlet;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    import com.kdyzm.utils.BaseServlet;
    
    public class ShowAll extends BaseServlet {
    
        @Override
        public void defaultMethod(HttpServletRequest request,
                HttpServletResponse response) throws ServletException, IOException {
            ServletContext sc=getServletContext();
            Map<String,HttpSession>map=(Map<String, HttpSession>) sc.getAttribute("map");
            List<Map<String,String>>list=new ArrayList<Map<String,String>>();
            if(map!=null)
            {
                Set<Map.Entry<String, HttpSession>>set=map.entrySet();
                Iterator <Map.Entry<String, HttpSession>> it=set.iterator();
                while(it.hasNext())
                {
                    Map.Entry<String, HttpSession>entry=it.next();
                    Map<String,String>hashMap=new HashMap<String,String>();
                    hashMap.put("name",entry.getValue().getAttribute("user").toString());
                    hashMap.put("ip",entry.getValue().getAttribute("ip").toString());
                    hashMap.put("createtime",new Date(entry.getValue().getCreationTime()).toString());
                    hashMap.put("lastaccesstime",new Date(entry.getValue().getLastAccessedTime()).toString());
                    list.add(hashMap);
                }
            }
            request.setAttribute("userlist", list);
            request.getRequestDispatcher("/showAll.jsp").forward(request, response);
        }
    
    }
    ShowAll.java

          [2]处理登陆和踢人请求的Servlet

    package com.kdyzm.servlet;
    
    import java.io.IOException;
    import java.util.Map;
    
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    import com.kdyzm.utils.BaseServlet;
    
    public class UserServlet extends BaseServlet {
        //默认是登陆
        @Override
        public void defaultMethod(HttpServletRequest request,
                HttpServletResponse response) throws IOException {
            String name=request.getParameter("name");
            String password=request.getParameter("password");
            //暂时不验证
            HttpSession session=request.getSession();
            session.setAttribute("user", name);
            response.sendRedirect(request.getContextPath()+"/index.jsp");
        }
        public void remove(HttpServletRequest request,HttpServletResponse response) throws IOException
        {
            String name=request.getParameter("name");
            name=new String(name.getBytes("iso-8859-1"),"utf-8");
            ServletContext sc=getServletContext();
            Map<String,HttpSession>map=(Map<String, HttpSession>) sc.getAttribute("map");
            HttpSession session=map.get(name);
            session.removeAttribute("user");
            response.sendRedirect(request.getContextPath()+"/showAll");
        }
    }
    UserServlet.java

      3.配置文件web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="3.0"
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
      <filter>
          <filter-name>sessionSetIpFilter</filter-name>
          <filter-class>com.kdyzm.filter.SessionSetIpFilter</filter-class>
      </filter>
      <filter>
          <filter-name>loginFilter</filter-name>
          <filter-class>com.kdyzm.filter.LoginFilter</filter-class>
      </filter>
      <filter-mapping>
          <filter-name>loginFilter</filter-name>
          <url-pattern>/showAll.jsp</url-pattern>
          <dispatcher>REQUEST</dispatcher>
          <dispatcher>FORWARD</dispatcher>
      </filter-mapping>
      <filter-mapping>
          <filter-name>sessionSetIpFilter</filter-name>
          <url-pattern>/*</url-pattern>
      </filter-mapping>
      
      <servlet>
        <servlet-name>UserServlet</servlet-name>
        <servlet-class>com.kdyzm.servlet.UserServlet</servlet-class>
      </servlet>
      <servlet>
        <servlet-name>ShowAll</servlet-name>
        <servlet-class>com.kdyzm.servlet.ShowAll</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>UserServlet</servlet-name>
        <url-pattern>/userServlet</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <servlet-name>ShowAll</servlet-name>
        <url-pattern>/showAll</url-pattern>
      </servlet-mapping>
        
        <listener>
            <listener-class>com.kdyzm.listener.SessionAttributeListener</listener-class>
        </listener>
        
    </web-app>
    web.xml

      4.jsp文件

        (1)登陆JSP

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8" 
        contentType="text/html; charset=utf-8" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
        <title>Insert title here!</title>
        <style type="text/css">
            table {
                border: 1px solid black;
                border-collapse: collapse;
                margin: 0 auto;
            }
            td {
                border: 1px solid black;
                text-align: center;
                padding: 3px;
            }
        </style>
      </head>
      <body>
        <!-- 默认是登陆界面 -->
        <c:choose>
            <c:when test="${empty sessionScope.user}">
                <form action="<c:url value='/userServlet'/>" method="post">
                    <table>
                        <tr>
                            <td>用户名:</td>
                            <td><input type="text" name="name"></td>
                        </tr>
                        <tr>
                            <td>密码:</td>
                            <td><input type="text" name="password"></td>
                        </tr>
                        <tr>
                            <td colspan="2"><input type="submit" value="登陆"></td>
                        </tr>
                    </table>
                </form>
            </c:when>
            <c:otherwise>
                ${sessionScope.user}已登录!<br/>
                <a href="<c:url value='/showAll'/>">查看登陆用户列表</a>
            </c:otherwise>
        </c:choose>
      </body>
    </html>
    index.jsp

        (2)显示用户列表JSP

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8" 
        contentType="text/html; charset=utf-8" %>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
        <title>Insert title here!</title>
          <style type="text/css">
                table {
                border: 1px solid black;
                border-collapse: collapse;
                margin: 0 auto;
            }
            td {
                border: 1px solid black;
                text-align: center;
                padding: 3px;
            }
          </style>
      </head>
      
      <body>
        这里是在线用户列表!
        <table>
            <tr>
                <td>用户名</td>
                <td>ip地址</td>
                <td>首次访问时间</td>
                <td>最后一次访问时间</td>
                <td>踢人</td>
            </tr>
            <c:forEach items="${requestScope.userlist}" var="map">
                <tr>
                    <td>${map.name}</td>
                    <td>${map.ip}</td>
                    <td>${map.createtime }</td>
                    <td>${map.lastaccesstime}</td>
                    <td><a href="<c:url value='/userServlet?cmd=remove&name=${map.name}'/>">踢人</a></td>
                </tr>
            </c:forEach>        
        </table>
      </body>
    </html>
    showAll.jsp

      5.注意事项:

        (1)Map对象使用put(key,value)方法之后,可以在JSP页面中使用EL表达式${map对象.key)的方式将映射的值取出。

        (2)将IP放到session作用域中之后不能在监视器中直接将该ip拿出,拿到的一定是NULL。

        (3)使用登陆过滤器的时候一定要注意避免循环重定向错误

      6.出现的错误

        循环重定向错误

        

      7.小练习结果:

        (1)直接访问showAll.jsp,重定向到index.jsp页面

        

        (2)登陆之后,再次登陆

        

        (3)查看用户列表

     

        (4)在其它机器登陆之后

        (5)将其他机器上登陆的用户踢掉(不要踢我)

          【1】我的当前页面

      

          【2】其他机器不能继续访问该页面,重定向到登陆页面(刷新之后)

  • 相关阅读:
    Android 控件的学习
    Java并发编程
    Glide的学习之路
    插件化和热修复学习之路
    OkHttp的学习
    WMS的学习
    app一点一滴的学习
    进程启动学习
    View学习之解决滑动冲突
    应用学习
  • 原文地址:https://www.cnblogs.com/kuangdaoyizhimei/p/4590633.html
Copyright © 2011-2022 走看看