Servlet (5)

1.java Servlet Filter (filtro)
Filter es un filtro de servlet, una nueva función agregada en la especificación Servlet 2.3, que se utiliza principalmente para completar algunas operaciones comunes, como el filtrado de codificación, juzgar el estado de inicio de sesión del usuario, etc.
El filtro se llama filtro, y su función principal es interceptar el proceso de llamar al servlet por el contenedor del servlet, para realizar algunas funciones especiales antes y después del procesamiento de respuesta del servlet.
Inserte la descripción de la imagen aquí

Nota: el filtro se implementa en el servidor.
Cuando el usuario accede al recurso de destino en el servidor a través del navegador, primero será interceptado por el Filtro, la operación de preprocesamiento se realizará en el Filtro y luego la solicitud se reenviará al recurso de destino. Cuando el servidor recibe esta solicitud, responderá a ella. En el proceso de procesamiento de la respuesta, el servidor también necesita procesar el resultado de la respuesta a través del filtro antes de enviarlo al cliente.
Esencialmente, Filter es una clase que implementa la interfaz javax.servlet.Filter, y se definen tres métodos en la interfaz javax.servlet.Filter
Inserte la descripción de la imagen aquí

Los tres métodos de la tabla son todos métodos que pueden representar el ciclo de vida del filtro. Se llama al método init () cuando se carga la aplicación web, y se llama al método destroy () cuando se descarga (o se cierra) la aplicación web Cada método solo se llamará una vez, y el método doFilter () se llamará varias veces (siempre que el cliente lo solicite), todo el trabajo del Filtro se concentra en el método doFilter ().
El siguiente ejemplo demuestra cómo el programa Filter intercepta el proceso de llamada del programa Servlet.
1. Cree un servlet para que sirva como recurso de destino.

package com.wangxing.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyTestServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("MyTestServlet----");
		PrintWriter  out=resp.getWriter();
		out.write("Hello MyServlet");
		out.close();
	}
}

2. Crea un filtro

  1. 1. Cree una nueva clase e implemente la interfaz javax.servlet.Filter
  2. Reescribe los métodos init, doFilter y destroy
  3. Escribir acciones de filtrado específicas en doFilter
  4. Filtro de configuración web.xml
package com.wangxing.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MyTestFilter implements Filter{
	@Override
	public void init(FilterConfig arg0) throws ServletException {
		System.out.println("init方法初始化过滤器");
	}
	@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("doFilter方法过滤请求/响应对象");
		//FilterChain chain---过滤器链对象
		//doFilter(req, resp)---将请求/响应对象传递给下一个过滤器/目标资源
		chain.doFilter(req, resp);
	}
	@Override
	public void destroy() {
		System.out.println("destroy方法销毁过滤器对象");
	}
}

Web.xml

<filter>
  	<filter-name>myfilter1</filter-name>
  	<filter-class>com.wangxing.filter.MyTestFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>myfilter1</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping> 
  <servlet>
  	<servlet-name>mytest</servlet-name>
  	<servlet-class>com.wangxing.servlet.MyTestServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>mytest</servlet-name>
  	<url-pattern>/mytest</url-pattern>
  </servlet-mapping>

测试http: // localhost: 8080 / TestFilterDemo1 / mytest

Nota: El filtro puede responder directamente a la solicitud del usuario, sin necesidad de procesamiento de recursos de servlet / destino.
2. Dos métodos de mapeo del filtro de servlet Java
Después de crear el filtro, la información de configuración correspondiente en web.xml es el mapeo del filtro. Los métodos de asignación de filtros se pueden dividir en dos tipos.
1. Utilice comodines para interceptar todas las solicitudes de los usuarios [ -todas las solicitudes]

<filter>
  	<filter-name>myfilter1</filter-name>
  	<filter-class>com.wangxing.filter.MyTestFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>myfilter1</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping> 

Inserte la descripción de la imagen aquí

2. Interceptar las solicitudes de acceso
de diferentes formas En el archivo web.xml, cada elemento se puede configurar con un recurso que el Filtro se encarga de interceptar. Hay un elemento secundario especial en el elemento, que se utiliza para especificar cómo el contenedor de servlets llama al recurso interceptado por el filtro. Hay cuatro valores de elementos.
Inserte la descripción de la imagen aquí

P.ej:

<filter>
  	<filter-name>myfilter1</filter-name>
  	<filter-class>com.wangxing.filter.MyTestFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>myfilter1</filter-name>
  	<url-pattern>/*</url-pattern>
  	<dispatcher>FORWARD</dispatcher>
  </filter-mapping> 

Por ejemplo:
cuando FORWARD indica que se accede al recurso a través del método forward () de RequestDispatcher, se utilizará el filtro configurado actualmente. Cuando enviamos una solicitud sin usar el método forward () de RequestDispatcher, no se usará el filtro configurado actualmente.

3. Interceptar solicitudes de acceso para diferentes rutas de acceso
Al especificar diferentes rutas de acceso en el elemento de configuración, determine qué recursos pueden acceder al filtro actual y qué recursos no pueden acceder al filtro actual.

<filter>
  	<filter-name>myfilter1</filter-name>
  	<filter-class>com.wangxing.filter.MyTestFilter</filter-class>
  </filter>
   <filter-mapping>
  	<filter-name>myfilter1</filter-name>
  	<url-pattern>/mytest</url-pattern>
  </filter-mapping> 
  
  <filter>
  	<filter-name>myfilter2</filter-name>
  	<filter-class>com.wangxing.filter.MyOtherFilter</filter-class>
  </filter>
   <filter-mapping>
  	<filter-name>myfilter2</filter-name>
  	<url-pattern>/myother</url-pattern>
  </filter-mapping> 
  
  <servlet>
  	<servlet-name>mytest</servlet-name>
  	<servlet-class>com.wangxing.servlet.MyTestServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>mytest</servlet-name>
  	<url-pattern>/mytest</url-pattern>
  </servlet-mapping>
  
  <servlet>
  	<servlet-name>myother</servlet-name>
  	<servlet-class>com.wangxing.servlet.OtherTestServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>myother</servlet-name>
  	<url-pattern>/myother</url-pattern>
  </servlet-mapping>

http: // localhost: 8080 / TestFilterDemo3 / mytest
Inserte la descripción de la imagen aquí

http: // localhost: 8080 / TestFilterDemo3 / myother
Inserte la descripción de la imagen aquí

3. Explicación detallada de FilterChain (cadena de filtros)
Se pueden registrar varios programas de filtro en una aplicación web y cada programa de filtro se puede interceptar para una determinada URL. Si varios programas de filtro interceptan la misma URL, estos filtros formarán una cadena de filtros (también llamada cadena de filtros).
La cadena Filter está representada por el objeto FilterChain. Hay un método doFilter () en el objeto FilterChain. La función de este método es dejar pasar el filtro actual en la cadena Filter y hacer que la solicitud ingrese al siguiente Filter.
Inserte la descripción de la imagen aquí

En la figura anterior, cuando el navegador accede a los recursos del servidor web, debe pasar por dos filtros Filter1 y Filter2. Primero, Filter1 interceptará esta solicitud. Una vez procesada la solicitud en Filter1, la solicitud se pasa a Filter2 llamando al método doFilter () a través del objeto FilterChain de la cadena Filter. Después de que Filter2 procesa la solicitud del usuario, el mismo objeto FilterChain llama el método doFilter () y, finalmente, la solicitud enviada al recurso de destino. Cuando el servidor Web responda a esta solicitud, también será interceptado por el filtro, pero la secuencia de interceptación es contraria a la anterior, y el resultado de la respuesta finalmente se envía al navegador del cliente.
Inserte la descripción de la imagen aquí

P.ej:

<filter>
  	<filter-name>base</filter-name>
  	<filter-class>com.wangxing.filter.BaseFilter</filter-class>
  </filter>
   <filter-mapping>
  	<filter-name>base</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping> 
  
  <filter>
  	<filter-name>myfilter2</filter-name>
  	<filter-class>com.wangxing.filter.MyOtherFilter</filter-class>
  </filter>
   <filter-mapping>
  	<filter-name>myfilter2</filter-name>
  	<url-pattern>/mytest</url-pattern>
  </filter-mapping> 

   <filter>
  	<filter-name>myfilter1</filter-name>
  	<filter-class>com.wangxing.filter.MyTestFilter</filter-class>
  </filter>
   <filter-mapping>
  	<filter-name>myfilter1</filter-name>
  	<url-pattern>/mytest</url-pattern>
  </filter-mapping> 
  

  <servlet>
  	<servlet-name>mytest</servlet-name>
  	<servlet-class>com.wangxing.servlet.MyTestServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>mytest</servlet-name>
  	<url-pattern>/mytest</url-pattern>
  </servlet-mapping>

http: // localhost: 8080 / TestFilterDemo3 / mytest
Inserte la descripción de la imagen aquí

Cada filtro de la cadena de filtros se ejecuta en el mismo orden en que se configura en el archivo web.xml.
4. Explicación detallada de la
interfaz FilterConfig y su uso La interfaz FilterConfig es similar a la interfaz ServletConfig que aprendimos anteriormente.
FilterConfig es una interfaz proporcionada por la API de Servlet para obtener la información de configuración del programa Filter en el archivo web.xml. Esta interfaz encapsula toda la información de registro del programa Filter en el web.xml, y proporciona una serie de formas de obtener estas configuraciones. método de información.
Inserte la descripción de la imagen aquí

Pruebe el método de interfaz de FilterConfig

package com.wangxing.filter;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class MyTestFilter implements Filter{
	@Override
	public void init(FilterConfig config) throws ServletException {
		System.out.println("init方法初始化过滤器");
		//测试FilterConfig接口对象的常用方法
		//String getFilterName()--- web.xml 文件中为 Filter 所设置的名称.
		String filtername=config.getFilterName();
		System.out.println("filtername=="+filtername);
		//String getInitParameter(String name)---得到web.xml文件中配置的指定的初始化参数值
		String myname=config.getInitParameter("myname");
		System.out.println("myname=="+myname);
		//Enumeration getInitParameterNames()---得到web.xml文件中配置的初始化参数的名称。
		Enumeration<String>  initnameString=config.getInitParameterNames();
		  // 遍历所有的初始化参数名,得到相应的参数值并打印
        while (initnameString.hasMoreElements()) {
          String paramname = initnameString.nextElement();
          String value = config.getInitParameter(paramname);
          System.out.println("初始化信息=="+paramname+"="+value);
        }
	}
	@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("MyTestFilter---doFilter方法过滤请求/响应对象");
		chain.doFilter(req, resp);
	}
	@Override
	public void destroy() {
		System.out.println("destroy方法销毁过滤器对象");
	}
}

Web.xml

<filter>
     <filter-name>myfilter</filter-name>
     <filter-class>com.wangxing.filter.MyTestFilter</filter-class>
     <init-param>
     	<param-name>myname</param-name>
     	<param-value>zhangsan</param-value>
     </init-param>
      <init-param>
     	<param-name>myaddress</param-name>
     	<param-value>西安</param-value>
     </init-param>
  </filter>
  <filter-mapping>
  	<filter-name>myfilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>

Inicie el servidor para ver el resultado de la ejecución
Inserte la descripción de la imagen aquí

5. Servlet Filter realiza la codificación unificada de todo el sitio y resuelve el problema de los caracteres ilegibles chinos.
Nota: El formato de codificación predeterminado después de tomcat8 es utf-8; los anteriores a 7 son iso8859-1

package com.wangxing.filter;
import java.io.IOException;
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.HttpServletResponse;

/**
 * 编码过滤器【全站统一编码,解决中文乱码问题】
 * @author Administrator
 *
 */
public class EncodingFilter implements Filter{
	private String encoding="utf-8";
	@Override
	public void init(FilterConfig confing) throws ServletException {
		this.encoding=confing.getInitParameter("encoding");
	}
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		//转换ServletRequest为HttpServletRequest
		HttpServletRequest req=(HttpServletRequest)request;
		//转换ServletResponse为HttpServletResponse
		HttpServletResponse resp=(HttpServletResponse)response;
		//设置请求和响应的字符编码
		//解决post请求的中文乱码
		req.setCharacterEncoding(this.encoding);
		resp.setCharacterEncoding(this.encoding);
		resp.setContentType("text/html;charset="+this.encoding);
		//解决get请求的中文乱码
		//重写getParameter方法
		// 对 request 进行包装
        CharacterRequest characterRequest = new CharacterRequest(req,this.encoding);
        chain.doFilter(characterRequest, resp);
	}
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}
}
package com.wangxing.filter;

import java.io.UnsupportedEncodingException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
/**
 *  对 request 进行包装
 * @author Administrator
 *
 */
public class CharacterRequest extends HttpServletRequestWrapper {
	private HttpServletRequest request;
	private String encoding="utf-8";
	public CharacterRequest(HttpServletRequest request,String encoding) {
		super(request);
		this.request=request;
		this.encoding=encoding;
	}
	
	@Override
	public String getParameter(String name) {
		String value = request.getParameter(name);
		if (value == null) {
	          return null;
	        }
		//得到请求的提交方式
		String method = request.getMethod(); 
		if ("get".equalsIgnoreCase(method)) {
            try {
            	//tomcat8以后默认编码格式是utf-8;7之前的都是iso8859-1
                value = new String(value.getBytes(this.encoding), this.encoding);
            } catch (UnsupportedEncodingException e) {
                throw new RuntimeException(e);
            }
        }
		return value;
	}
}
package com.wangxing.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyTestServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("MyTestServlet----");
		String myname=req.getParameter("myname");
		System.out.println("myname=="+myname);
		PrintWriter  out=resp.getWriter();
		out.write("Hello MyServlet==myname=="+myname);
		out.close();
	}
}

Web.xml

<filter>
  	<filter-name>encodingfilter</filter-name>
  	<filter-class>com.wangxing.filter.EncodingFilter</filter-class>
  	<init-param>
  		<param-name>encoding</param-name>
  		<param-value>utf-8</param-value>
  	</init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingfilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  
  <servlet>
  	<servlet-name>mytest</servlet-name>
  	<servlet-class>com.wangxing.servlet.MyTestServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>mytest</servlet-name>
  	<url-pattern>/mytest</url-pattern>
  </servlet-mapping>

测试
http: // localhost: 8080 / EncodingFilter / mytest? Myname =% E5% BC% A0% E4% B8% 89

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/guoguo0717/article/details/109186545
Recomendado
Clasificación