Восьмое примечание к исследованию JavaWeb: фильтр

Фильтр Фильтр

Фильтр предназначен для фильтрации ресурсов, к которым обращается клиент.Если условия выполняются, он будет освобожден, а если условия не выполнены, он не будет освобожден.Он также может выполнять логическую обработку целевых ресурсов до и после доступа к ним.

шаг:

  1. Напишите класс фильтра, который реализует интерфейс фильтра.
  2. Реализовать методы, которые не были реализованы в интерфейсе (сосредоточьтесь на реализации метода doFilter)
  3. Настроить в web.xml (в основном настроить, какие ресурсы фильтровать)

Пример, класс реализации фильтра:

package com.yyb.filter;

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

/**
 * Created by Administrator on 2017/7/28.
 */
public class FilterDemo implements Filter {
    
    
    @Override
    //Filter创建的时候执行init方法
    public void init(FilterConfig filterConfig) throws ServletException {
    
    
        //1、获得web.xml中filter 的名称<filter-name>FilterDemo</filter-name>
        System.out.println(filterConfig.getFilterName());
        //2、获得当前filter的初始化参数
        System.out.println(filterConfig.getInitParameter("aaa"));
        //3、获得servletContext
        filterConfig.getServletContext();

        System.out.println("init ....");
    }

    @Override
    //doFilter是Filter的核心过滤的方法
    /*
     * request: 内部封装是客户端http请求的内容
     * response: 代表是响应
     * FilterChain: 过滤器链对象
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
    
    

        System.out.println("quick1 running....");
        //放行请求
        chain.doFilter(request, response);
    }

    @Override
    //Filter对象销毁的时候执行destory方法
    public void destroy() {
    
    
        System.out.println("destroy...");
    }
}

веб.xml

<filter>
        <filter-name>FilterDemo</filter-name>
        <filter-class>com.yyb.filter.FilterDemo</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>FilterDemo</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

Подробный API фильтра

Жизненный цикл фильтра и методы, связанные с его жизненным циклом, интерфейс фильтра имеет три метода, и все эти три метода относятся к жизни фильтра:

  • init(Filterconfig): представляет метод инициализации объекта фильтра, который выполняется при создании объекта фильтра.
  • doFilter(ServletRequest,ServletResponse,FilterCha): представляет основной метод фильтра для выполнения фильтрации. Если ресурс был настроен для этого фильтра для фильтрации, метод doFilter будет выполняться каждый раз при доступе к ресурсу.
  • destroy(): представляет метод уничтожения фильтра, который выполняется при уничтожении объекта фильтра.

Жизненный цикл объекта Filter

  • При создании фильтра: объект фильтра создается при запуске сервера.
  • При уничтожении фильтра: фильтр уничтожается при закрытии сервера
    init(FilterConfig): параметр config представляет собой объект информации о конфигурации объекта фильтра, а внутренний пакет представляет собой информацию о конфигурации фильтра.

Метод destroy(): выполняется при уничтожении объекта фильтра.

Метод doFilter: doFilter(ServletRequest, ServletResponse, FilterChain), параметр ServletRequest/ServletResponse заключается в том, что веб-контейнер отвечает за создание объекта запроса и ответа в качестве параметров doFilter при каждом выполнении метода doFilter. Запрос и ответ — это запрос и ответ при доступе к сервисному методу целевого ресурса. FilterChain — это объект цепочки фильтров, и запрос может быть выпущен с помощью метода doFilter объекта. Объект цепочки выполняет фильтры последовательно в соответствии с настроенным порядком сопоставления фильтров.
вставьте сюда описание изображения

<filter>
        <filter-name>FilterDemo</filter-name>
        <filter-class>com.yyb.filter.FilterDemo</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>FilterDemo</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

конфигурация URL-шаблона

  • Точное соответствие
        /Servlet1, выполнение только при доступе к Servlet1

  • Соответствие каталога /aaa/bbb/*
    /user/ : Доступ к ресурсам на переднем плане введите этот фильтр
    /admin/
    : Выполните этот фильтр при доступе к ресурсам в фоновом режиме

  • Расширение соответствует *.abc *.jsp

Примечание: url-шаблон может быть заменен именем сервлета или смешанным.

<filter-mapping>
        <filter-name>FilterDemo</filter-name>
        <!--<url-pattern>/*</url-pattern>-->
        <servlet-name>FilterTest</servlet-name>
        <servlet-name>FilterTest1</servlet-name>
    </filter-mapping>

диспетчер: способ доступа

  • ЗАПРОС: значение по умолчанию, означающее выполнение фильтра при прямом доступе к ресурсу.
  • FORWARD: выполнять фильтр только при пересылке
  • ВКЛЮЧИТЬ: Выполнить фильтр, когда ресурсы включены
  • ОШИБКА: Выполнить фильтр при переходе при возникновении ошибки

Пример: web.xml

  <filter>
        <filter-name>FilterDemo</filter-name>
        <filter-class>com.yyb.filter.FilterDemo</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>FilterDemo</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

В FilterTest добавьте код пересылки request.getRequestDispatcher("/index.jsp").forward(request, response);. В настоящее время при доступе к FilterTest фильтр будет выполняться только последовательно, а не дважды. Фильтры не выполняются при пересылке.

Но перенаправление будет выполнено дважды, в FilterTest добавьте код переадресации response.sendRedirect(request.getContextPath()+"/index.jsp");, и вы увидите результат выполнения.

Роль фильтра

  • Извлечение публичного кода
  • Методы в запросе и ответе могут быть улучшены (режим декоратора/динамический прокси)
  • Выполнить контроль разрешений

Используйте фильтр для решения параметра искаженных китайских символов

package com.ithiema.web.filter;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

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.HttpServletRequestWrapper;

public class EncodingFilter implements Filter{
    
    
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
    
    
        
        //request.setCharacterEncoding("UTF-8");
        
        //在传递request之前对request的getParameter方法进行增强
        /*
         * 装饰者模式(包装)
         * 
         * 1、增强类与被增强的类要实现统一接口
         * 2、在增强类中传入被增强的类
         * 3、需要增强的方法重写 不需要增强的方法调用被增强对象的
         * 
         */
        
        //被增强的对象
        HttpServletRequest req = (HttpServletRequest) request;
        //增强对象
        EnhanceRequest enhanceRequest = new EnhanceRequest(req);
        chain.doFilter(enhanceRequest, response);
    }

    @Override
    public void destroy() {
    
    
    }
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    
    
    }

}

class EnhanceRequest extends HttpServletRequestWrapper{
    
    
    private HttpServletRequest request;
    public EnhanceRequest(HttpServletRequest request) {
    
    
        super(request);
        this.request = request;
    }
    
    //对getParaameter增强
    @Override
    public String getParameter(String name) {
    
    
        String parameter = request.getParameter(name);//乱码
        try {
    
    
            parameter = new String(parameter.getBytes("iso8859-1"),"UTF-8");
        } catch (UnsupportedEncodingException e) {
    
    
            e.printStackTrace();
        }
        return parameter;
    }
}

Supongo que te gusta

Origin blog.csdn.net/weixin_42838061/article/details/121198500
Recomendado
Clasificación