研究ノート8:フィルターフィルターとリスナー

フィルタ

フィルタは、javax.servlet.Filterインターフェイスを実装することによって実装されます。このインターフェイスには、init()、doFilter()、destroy()の3つのメソッドがあり、
それぞれ対応する実際のメソッドで実行されます。

package com.hou.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter("/01")   //拦截路径  拦截所有的资源路径可以使用通配符 ("/*")
public class Filter01 implements Filter {
    
    
    public void init(FilterConfig filterConfig) throws ServletException {
    
    
        
    }

    /**
     * 过滤方法
     * @param servletRequest
     * @param servletResponse
     * @param filterChain
     * @throws IOException
     * @throws ServletException
     */
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    
    
        
        //放行资源,一定别忘了,不放行程序就不会继续往下走了
        System.out.println("filter01资源过滤----");
        filterChain.doFilter(servletRequest, servletResponse);
        
    }

    public void destroy() {
    
    

    }
}

フィルタチェーンを形成する複数のフィルタがある場合、最初に設定されたものが最初に実行されます。

アクセス許可の傍受:

/**
 * 访问权限拦截
 */
@WebFilter("/*")
public class LoginAccessFilter implements Filter {
    
    
    public void init(FilterConfig filterConfig) throws ServletException {
    
    

    }

    /**
     * 功能:指定页面和请求放行,如果用户session不存在,拦截回login.jsp,如果存在,放行
     * @param servletRequest
     * @param servletResponse
     * @param filterChain
     * @throws IOException
     * @throws ServletException
     */
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    
    
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        //获取请求的路径
        String uri = request.getRequestURI();
        System.out.println(uri);

		//String类 的 contains 方法可以帮助查询有没有指定的字符序列
        //如果请求路径中包含/login.jsp 这一段字符就放行
        if (uri.contains("/login.jsp") || uri.contains("loginServlet")){
    
    
            filterChain.doFilter(request,response);
            System.out.println("放行-----");
            return;
        }
        User user = (User) request.getSession().getAttribute("user");
        System.out.println(user);

        if (user != null){
    
    
            filterChain.doFilter(request,response);
            return;
        }
        //如果不是指定路径的页面或查出用户session为空代表用户没登录,那么直接跳转回login.jsp
        response.sendRedirect("login.jsp");


    }

    public void destroy() {
    
    

    }
}

リスナー

前書き:

Webリスナーは、ServletContext、HttpSession、ServletRequestの作成と破棄、または変数の作成、破棄、変更など、Web内の特定のイベントとアクションを監視するために使用されるServletの特別なクラスです。アクションの後に処理を追加して、監視を実現できます。

次のような用途:オンラインの人数を数えるなど...

使用法:HttpSessionListener、ServletRequestListenerなどの対応する監視インターフェースを実装します。

セッションの作成と破棄を監視します。アノテーション@WebListenerを追加することを忘れないでください

package com.xxxx.listener;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

@WebListener
public class Listener01 implements HttpSessionListener {
    
    
    /**
     * 在Session对象被创建时执行
     * @param httpSessionEvent
     */
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
    
    
        System.out.println("监听:Session创建");
    }

    /**
     * Session对象被销毁时执行
     * @param httpSessionEvent
     */
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
    
    

        System.out.println("监听:Session销毁");
    }
}

小さなケース:オンライン統計

ケースのハイライト

  1. リスナーがセッションの作成を監視する場合、ユーザーがもう1人いることを意味し、ユーザー数は+1である必要があります。セッションが破棄されると、逆のことが当てはまります。
  2. 最終データはサーブレット制御層に返されるため、アプリケーションドメイン、つまりServletContextドメインに人数を格納して、すべてのユーザーがリアルタイムの人数を共有できるようにする必要があります。それ以外の場合、セッションドメインに保存されている場合、ユーザーは自分のセッションまでの人数のみを表示できます。

リスナークラス:

package com.xxxx.listener;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * 实现在线人数统计
 */
@WebListener
public class OnlineListener implements HttpSessionListener {
    
    
    private Integer onlineNumber = 0;

    /**
     * 当有新的session对象创建时,人数+1
     * @param httpSessionEvent
     */
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
    
    
        onlineNumber++;
        //将更新的人数信息存如session
//        httpSessionEvent.getSession().setAttribute("onlineNumber",onlineNumber);
        httpSessionEvent.getSession().getServletContext().setAttribute("onlineNumber",onlineNumber);
    }

    /**
     * 当一个session对象销毁时,人数-1
     * @param httpSessionEvent
     */
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
    
    
        onlineNumber--;
        //将更新的人数信息存如session
//        httpSessionEvent.getSession().setAttribute("onlineNumber",onlineNumber);
        httpSessionEvent.getSession().getServletContext().setAttribute("onlineNumber",onlineNumber);
    }
}

サーブレットクラス:

package com.xxxx.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/onlineServlet")
public class OnlineServlet extends HttpServlet {
    
    
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        HttpSession session = request.getSession();

        String key = request.getParameter("key");
        //如果传如的参数为logout,则表示退出,销毁该用户的session
        if (key != null && "logout".equals(key)){
    
    
            session.invalidate();
            return;
        }
        Integer onlineNumber = (Integer) session.getServletContext().getAttribute("onlineNumber");
        response.getWriter().write("<h2>当前在线人数:"+onlineNumber+"</h2> <a href='onlineServlet?key=logout'>退出</a>");
    }
}

おすすめ

転載: blog.csdn.net/qq_40492885/article/details/115314670