web 中过滤器和监听器

  1. MVC模型

    MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。

    • Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。
    • View(视图) - 视图代表模型包含的数据的可视化。
    • Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。
  2. 实现


    创建一个 Student 对象。
    StudentView 是一个把学生详细信息输出到控制台的视图类
    StudentController 是负责存储数据到 Student 对象中的控制器类,并相应地更新视图 StudentView。

  3. 过滤器

    在Web中的过滤器,对请求进行过滤,通过使用过滤器,可以对请求进行拦截,然后做相应的处理,实现许多特殊功能。

    • 身份验证和授权: 检查用户是否已登录,是否有权限访问某些资源。
    • 日志记录: 记录请求和响应的相关信息,用于调试和分析。
    • 字符编码处理: 对请求和响应进行字符编码的转换。
    • 性能监控: 统计请求的处理时间,检测潜在的性能问题。

    过滤器的生命周期:

    • init(FilterConfig config): 用于进行过滤器的初始化工作,在容器启动时被调用。
    • doFilter(ServletRequest request, ServletResponse response, FilterChain chain): 执行过滤操作的核心方法,可以在此方法中对请求和响应进行处理,并将请求传递给下一个过滤器(或Servlet)。
    • destroy(): 在容器关闭时被调用,用于执行一些资源释放的操作

    过滤器的实现:

      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 java.io.IOException;
    
      public class MyFilter implements Filter {
          //注意是servlet中的Filter接口
    
          @Override
          public void init(FilterConfig filterConfig) throws ServletException {
              // 初始化操作,可获取配置信息
          }
    
          @Override
          public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                  throws IOException, ServletException {
              // 在请求处理之前执行的逻辑
              System.out.println("Before Request Processing in Filter");
    
              // 执行下一个过滤器(如果有),或者到达Servlet
              chain.doFilter(request, response);//放行
    
              // 在请求处理之后执行的逻辑
              System.out.println("After Request Processing in Filter");
          }
    
          @Override
          public void destroy() {
              // 资源释放操作
          }
      }
    
      //通过XML配置过滤器:
      <filter>
          <filter-name>MyFilter</filter-name>
          <filter-class>com.example.MyFilter</filter-class>
      </filter>
      <filter-mapping>
          <filter-name>MyFilter</filter-name>
          <url-pattern>/*</url-pattern>
      </filter-mapping> 
    
    
  4. 监听器

    什么是监听器:

    是一个实现了特定接口的Java类,用来监听另一个 Java类的方法调用或者属性的改变,当被监听对象发生了上述事件后,监听器某个方法将会立即被执行。

    Servlet 中监听器的分类:

    • 监听三个域对象的创建和销毁的监听器(三个);
    • 监听三个域对象的属性变更(属性添加、移除、替换)的监听器(三个);
    • 监听HttpSession中JavaBean的状态改变(钝化、活化、绑定、解除绑定)的监听器(两个);

    举例:监听HttpSession域对象的创建和销毁

      package com.test.listener;
    
      import javax.servlet.http.HttpSessionEvent;
      import javax.servlet.http.HttpSessionListener;
    
      public class MyHttpSessionListener implements HttpSessionListener {
    
          @Override
          public void sessionCreated(HttpSessionEvent se) {
              System.out.println( se.getSession() + "创建了!!");
          }
    
          @Override
          public void sessionDestroyed(HttpSessionEvent se) {
              System.out.println("session销毁了!!");
          }
      }
      //在web.xml文件中注册监听器:
      <!--注册针对HttpSession对象进行监听的监听器-->
         <listener>
            <listener-class>com.test.listener.MyHttpSessionListener</listener-class>
        </listener>
        <!-- 配置HttpSession对象的销毁时机 -->
        <session-config>
            <!--配置HttpSession对象的1分钟之后销毁 -->
            <session-timeout>1</session-timeout>
        </session-config>
    
  5. 用户登录后才能进入主页的案例

    思路: 从session中取登录后存到其中的值,能取到说明登陆过,放行到主页面,娶不到则说明没登录过跳转到错误页面。

    
      //创建常量类:
    
      package com.test.util;
       
      public class Constant {
          public final static String USER_SESSION="user_session";
    
      //创建过滤器:
    
      package com.test.filter;
       
      import com.test.util.Constant;
       
      import javax.servlet.*;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
       
      public class LoginFilter implements Filter {
          @Override
          public void init(FilterConfig filterConfig) throws ServletException {
       
          }
       
          @Override
          public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
              //ServletRequest  HttpServletRequest
              HttpServletRequest request=(HttpServletRequest) servletRequest;
              HttpServletResponse response=(HttpServletResponse) servletResponse;
       
              if(request.getSession().getAttribute(Constant.USER_SESSION)==null){
                  response.sendRedirect("/error/login-error.jsp");
              }
       
              filterChain.doFilter(request,response);//继续走业务逻辑
          }
       
          @Override
          public void destroy() {
       
          }
      }
      //配置web.xml
      <servlet>
          <servlet-name>LoginServlet</servlet-name>
          <servlet-class>com.test.servlet.LoginServlet</servlet-class>
      </servlet>
      <servlet-mapping>
          <servlet-name>LoginServlet</servlet-name>
          <url-pattern>/user/*</url-pattern>
      </servlet-mapping>
    
      <filter>
          <filter-name>LoginFilter</filter-name>
          <filter-class>com.test.filter.LoginFilter</filter-class>
      </filter>
      <filter-mapping>
          <filter-name>LoginFilter</filter-name>
          <url-pattern>/user/*</url-pattern>
      </filter-mapping>
    
      //登录页测试
      package com.test.servlet;
       
      import com.test.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 LoginServlet 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.USER_SESSION,req.getSession().getId());
                  resp.sendRedirect("/success.jsp");
              }else{//登录失败
                  resp.sendRedirect("/error/login-error.jsp");
              }
          }
       
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       
          }
      }
    
posted @   Hanyta  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示