• 过滤器与监听器 ----【javaweb-10】


    Filter && Listener

    1、过滤器

      过滤器:阻碍一些不符合要求的数据。

      常用在处理中文乱码、登录验证等

      1.1、初步使用Filter

      案例:我们将会通过Filter处理中文乱码

      代码展示:

        在这里,要注意继承的Filter接口是servlet的!以及三个固定的方法要写,还有filterChain也要写(作为中间商)

    package com.charles.fillter;
    
    import javax.servlet.*;
    import java.io.IOException;
    
    public class CharacterEncodingFillter implements Filter {
    
        // 初始化
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("CharacterEncoding初始化");
        }
    
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            servletRequest.setCharacterEncoding("utf-8");
            servletResponse.setCharacterEncoding("utf-8");
            servletResponse.setContentType("text/html;charset=UTF-8");
    
            System.out.println("执行前");
            // 让我们的请求继续走,不写则停下(中间商)
            filterChain.doFilter(servletRequest,servletResponse);
            System.out.println("执行后");
        }
    
        // 销毁
        public void destroy() {
            System.out.println("CharacterEncoding销毁");
        }
    }

      在web.xml中注册filter

      这里注意<url-pattern>的意思是 servlet下的所有请求都要经过这个过滤器

        <filter>
            <filter-name>CharacterEncodingFillter</filter-name>
            <filter-class>com.charles.fillter.CharacterEncodingFillter</filter-class>
        </filter>
        
        <filter-mapping>
            <filter-name>CharacterEncodingFillter</filter-name>
            <url-pattern>/servelet/*</url-pattern>
        </filter-mapping>

      1.2、简单的登录案例

      首先,我们先编写一个静态初始化参数,用来进行登录时对用户的验证

    package com.charles.util;
    
    public class Constant {
        public final static String Servelet_Name = "Servelet_Name";
    }

      然后,我们编写过滤器:用来建议用户名是否为空

    package com.charles.fillter;
    
    import com.charles.util.Constant;
    
    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class SysFillter implements Filter {
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            HttpServletRequest request = (HttpServletRequest) servletRequest;
            HttpServletResponse response = (HttpServletResponse) servletResponse;
    
            if (request.getSession().getAttribute(Constant.Servelet_Name) == null){
                response.sendRedirect("/error.jsp");
            }
    
            filterChain.doFilter(request,response);
        }
    
        public void destroy() {
    
        }
    }

      之后,我们开始依次编写Servlet(登录检验、注销后的跳转)

    package com.charles.servelet;
    
    import com.charles.util.Constant;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class LoginServelet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String username = req.getParameter("username");
    
            if (username.equals("admin")){ // 登陆成功
                req.getSession().setAttribute(Constant.Servelet_Name, req.getSession().getId());
                resp.sendRedirect("/sys/success.jsp");
            } else { // 登陆失败
                resp.sendRedirect("/error.jsp");
            }
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    package com.charles.servelet;
    
    import com.charles.util.Constant;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class LoginOut extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            Object attribute = req.getSession().getAttribute(Constant.Servelet_Name);
    
            if (attribute != null){
                req.getSession().removeAttribute(Constant.Servelet_Name);
                resp.sendRedirect("/Login.jsp");
            }
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }

      注册Servlet和Filter

        <servlet>
            <servlet-name>LoginServelet</servlet-name>
            <servlet-class>com.charles.servelet.LoginServelet</servlet-class>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>LoginServelet</servlet-name>
            <url-pattern>/servlet/login</url-pattern>
        </servlet-mapping>
    
        <servlet>
            <servlet-name>LoginOutServlet</servlet-name>
            <servlet-class>com.charles.servelet.LoginOut</servlet-class>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>LoginOutServlet</servlet-name>
            <url-pattern>/servlet/loginout</url-pattern>
        </servlet-mapping>
    
        <filter>
            <filter-name>SysFilter</filter-name>
            <filter-class>com.charles.fillter.SysFillter</filter-class>
        </filter>
    
        <filter-mapping>
            <filter-name>SysFilter</filter-name>
            <url-pattern>/sys/*</url-pattern>
        </filter-mapping>

      最后,依次编写网页(登录网页、登录后的网页、错误网页)

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <form action="/servlet/login" method="post">
        用户名:<input type="text" name="username">
        <input type="submit" value="登陆">
    </form>
    </body>
    </html>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <h1>登陆成功!!</h1>
    
    <p> <a href="/servlet/loginout">注销</a> </p>
    
    </body>
    </html>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    
    <h1>登陆失败!</h1>
    <h3>失败原因:1.无权限 2.用户名错误</h3>
    
    <a href="Login.jsp">返回登录页面</a>
    
    </body>
    </html>

      运行Tomcat后,结果展示:

      1、登录成功的效果

      2、登录失败的效果

    2、监听器

      监听器用的比较少,这里用一个简单的案例来展示一下即可。

    案例:监听访问该网页的次数,并打印内容次数至网页上

    代码展示:

    package com.charles.listener;
    
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;
    
    // 统计网站在线人数: 方法:统计session
    public class OnlineCountListener implements HttpSessionListener {
    
        // 创建session监听
        public void sessionCreated(HttpSessionEvent se) {
            ServletContext ctx = se.getSession().getServletContext();
            Integer onlineCount =(Integer) ctx.getAttribute("OnlineCount");
    
            if (onlineCount == null){
                onlineCount = new Integer(1);
            } else {
                int count = onlineCount.intValue();
                onlineCount = new Integer(count++);
            }
            ctx.setAttribute("onlineCount", onlineCount);
        }
    
        // 销毁session监听
        public void sessionDestroyed(HttpSessionEvent se) {
            ServletContext ctx = se.getSession().getServletContext();
            Integer onlineCount =(Integer) ctx.getAttribute("OnlineCount");
    
            if (onlineCount == null){
                onlineCount = new Integer(0);
            } else {
                int count = onlineCount.intValue();
                onlineCount = new Integer(count--);
            }
            ctx.setAttribute("onlineCount", onlineCount);
        }
    }

      注册listener(这里注意,注册只需要写代码的路径即可)

        <listener>
            <listener-class>com.charles.listener.OnlineCountListener</listener-class>
        </listener>

      网页设计

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>$Title$</title>
      </head>
      <body>
      <h1>当前有 <span style="color: red"><%=this.getServletConfig().getServletContext().getAttribute("onlineCount")%></span>人在线</h1>
      </body>
    </html>

    结果展示:

  • 相关阅读:
    PHP常用时间函数总结
    LNMP 1.2缓存加速类扩展(xcache/Redis/memcached/eAccelerator)、imageMagick、ionCube安装教程
    LNMP强制https访问
    查看lnmp的编译参数和版本
    LNMP 1.2/1.3+升级Nginx、MySQL/MariaDB、PHP教程
    微信小程序websocket多页面冲突解决办法
    lnmp “.user.ini”无法删除解决方法
    一些js函数
    vue下拉框三级联动
    mysql取某个字段中的内容有等于数组中某个元素的数据
  • 原文地址:https://www.cnblogs.com/Charles-H/p/Learning_Web_10.html
Copyright © 2020-2023  润新知