Maison >Java >javaDidacticiel >Quelles sont les fonctions, les types et les scénarios d'application de Filter en Java ?

Quelles sont les fonctions, les types et les scénarios d'application de Filter en Java ?

王林
王林avant
2023-05-26 10:26:521233parcourir

    Comment utiliser Filter

    Dans les applications Web Java, utiliser Filter est très simple, il suffit d'écrire une classe pour implémenter javax .servlet.Filter, puis configurez Filter dans le fichier de configuration web.xml pour utiliser Filter. Voici un exemple de code de filtre :

    public class MyFilter implements Filter {
        public void init(FilterConfig filterConfig) throws ServletException {
            // 初始化操作
        }
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            // 过滤器逻辑处理
            chain.doFilter(request, response);
        }
        public void destroy() {
            // 销毁操作
        }
    }

    Configurez le filtre dans le fichier de configuration web.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>

    La balise 1d24e586ca31f4bd05eca427459d98c7 nom du filtre et du chemin de classe, la balise dd0dfb26ea66647667f179a739921d33 spécifie les règles de mappage du filtre, c'est-à-dire les URL que le filtre intercepte.

    Le cycle de vie du filtre

    Le cycle de vie du filtre comporte trois méthodes : init(), doFilter() et destroy().

    Méthode init() : appelée lors de la création du Filtre, utilisée pour initialiser le Filtre. Cette méthode ne sera appelée qu'une seule fois.

    Lorsque l'intercepteur capture chaque requête, la méthode doFilter() est appelée pour traiter la requête et la réponse. Si vous devez continuer à exécuter le filtre suivant, vous devez appeler la méthode chain.doFilter(request, réponse), sinon vous n'avez pas besoin d'appeler cette méthode.

    destroy() méthode : appelée lorsque le Filtre est détruit, utilisée pour libérer des ressources.

    Ordre d'exécution des filtres

    Dans le fichier de configuration web.xml, vous pouvez configurer plusieurs filtres, et leur ordre d'exécution est exécuté en séquence dans l'ordre défini dans le fichier de configuration. Par exemple :

    <filter>
        <filter-name>FilterA</filter-name>
        <filter-class>com.example.FilterA</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>FilterA</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter>
        <filter-name>FilterB</filter-name>
        <filter-class>com.example.FilterB</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>FilterB</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    Dans la configuration ci-dessus, FilterA sera exécuté en premier, puis FilterB sera exécuté.

    Détails du filtre

    Connexion automatique

    Dans les applications Web, il est généralement nécessaire d'implémenter la fonction de connexion automatique, c'est-à-dire une fois que l'utilisateur a réussi se connecte, la prochaine fois Il n'est pas nécessaire de saisir à nouveau le nom d'utilisateur et le mot de passe lors de l'accès, il suffit d'accéder directement. Ce qui suit est une idée simple de connexion automatique :

    • Lorsque l'utilisateur se connecte, le nom d'utilisateur et le mot de passe sont enregistrés dans Cookie.

    • Déterminez si l'utilisateur s'est connecté dans le filtre. Sinon, déterminez s'il y a un cookie. Si un cookie existe, renseignez automatiquement le nom d'utilisateur et le mot de passe. le cookie. Dans le formulaire de connexion, effectuez à nouveau la vérification de la connexion.

    Ce qui suit est un exemple de code simple pour se connecter à Servlet :

    public class LoginServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // 获取用户名和密码
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            // 验证用户名和密码
            if ("admin".equals(username) && "123456".equals(password)) {
                // 登录成功,保存用户信息到Session中
                HttpSession session = request.getSession();
                session.setAttribute("username", username);
                // 保存自动登录信息到Cookie中
                Cookie cookie = new Cookie("autologin", username + ":" + password);
                cookie.setMaxAge(7 * 24 * 60 * 60); // 设置Cookie过期时间为一周
                response.addCookie(cookie);
                // 跳转到首页
                response.sendRedirect(request.getContextPath() + "/index.jsp");
            } else {
                // 登录失败,返回登录页面
                response.sendRedirect(request.getContextPath() + "/login.jsp");
            }
        }
    }

    Ce qui suit est un exemple de code simple pour le filtre de connexion automatique : # 🎜 🎜#

    public class AutoLoginFilter implements Filter {
        public void init(FilterConfig filterConfig) throws ServletException {
            // 初始化操作
        }
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            // 判断用户是否已经登录
            HttpSession session = ((HttpServletRequest) request).getSession();
            String username = (String) session.getAttribute("username");
            if (username == null) {
                // 判断是否存在Cookie
                Cookie[] cookies = ((HttpServletRequest) request).getCookies();
                if (cookies != null) {
                    for (Cookie cookie : cookies) {
                        if ("autologin".equals(cookie.getName())) {
                            // 自动填充用户名和密码
                            String[] values = cookie.getValue().split(":");
                            String autologinUsername = values[0];
                            String autologinPassword = values[1];
                            request.setAttribute("autologinUsername", autologinUsername);
                            request.setAttribute("autologinPassword", autologinPassword);
                        }
                    }
                }
            }
            chain.doFilter(request, response);
        }
        public void destroy() {
            // 销毁操作
        }
    }

    Utilisation de BeanUtils

    Dans le développement Web, nous avons généralement besoin de convertir les données de formulaire en objets JavaBean, et cette fonction peut être réalisée à l'aide de la classe d'outils BeanUtils. Utilisez BeanUtils pour encapsuler les données de formulaire dans des objets JavaBean, simplifiant ainsi le traitement des données de formulaire. Voici un exemple d'utilisation de BeanUtils :

    public class UserServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // 获取表单数据
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            int age = Integer.parseInt(request.getParameter("age"));
            // 将数据封装成User对象
            User user = new User();
            try {
                BeanUtils.setProperty(user, "username", username);
                BeanUtils.setProperty(user, "password", password);
                BeanUtils.setProperty(user, "age", age);
            } catch (Exception e) {
                e.printStackTrace();
            }
            // 保存用户信息
            UserService userService = new UserService();
            userService.saveUser(user);
            // 跳转到用户列表页面
            response.sendRedirect(request.getContextPath() + "/user/list.jsp");
        }
    }

    Dans le code ci-dessus, les données du formulaire sont encapsulées dans un objet User via la méthode BeanUtils.setProperty().

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration:
    Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer