Después de completar el código fuente
Sus nuevas características incluyen:
1. Control de eventos del ciclo de vida de la aplicación
2. Nueva internacionalización
3. reglas de carga de la clase
4. Nuevos errores y atributos de seguridad
5. El uso de la clase HttpUtils está obsoleto
6. ;
7. Se aclararon y ampliaron varias funciones de filtrado de servlets.
8.
La más importante es la función de filtro, que permite a los usuarios cambiar solicitudes y modificar respuestas. El filtro no es un servlet, no puede generar una respuesta, puede preprocesar la solicitud antes de que llegue al servlet y también puede procesar la respuesta cuando la solicitud sale del servlet. En otras palabras, Filter es en realidad un "encadenamiento de servlets" (cadena de servlets). Un filtro incluye:
1. Interceptar antes de llamar al servlet
2. Verificar la solicitud del servlet antes de llamar al servlet
3. encabezados y datos de solicitud;
4. Modifique los encabezados de respuesta y los datos de respuesta según sea necesario
5.
Puede configurar filtros para uno o más servlets; varios filtros pueden usar un solo servlet o un grupo de servlets. Varios filtros prácticos incluyen: filtros de identificación de usuario, filtros de registro, filtros de auditoría, filtros de cifrado, filtros de símbolos, filtros XSLT que pueden cambiar el contenido xml, etc.
El filtro debe implementar la interfaz javax.servlet.Filter y definir tres métodos:
1.void Set filter Config//Establecer el objeto de configuración del filtro;
2.filter config getfilterconfig()//Devuelve el objeto de configuración del filtro;
3.void do filter(servlet req req, servlet Response res, filter chain)//Realiza el trabajo de filtrado.
El servidor solo llama al método setFilterConfig una vez a la vez para prepararse para el procesamiento del filtro; llama al método doFilter varias veces para manejar diferentes solicitudes. La interfaz FilterConfig tiene un método para encontrar el nombre del filtro y la información del parámetro de inicialización. El servidor puede configurar FilterConfig en vacío para indicar que el filtro ha finalizado.
Cada filtro obtiene la solicitud y respuesta actual del método doFilter(). En este método, se puede realizar cualquier operación en la solicitud y la respuesta. (Incluida la recopilación de datos, el empaquetado de datos, etc.).filter llama al método chain.doFilter() para entregar el control al siguiente filtro. El filtro finaliza con el método doFilter(). Si un filtro quiere detener el procesamiento de solicitudes y obtener control total sobre la respuesta, es posible que no llame al siguiente filtro.
Los filtros pueden encapsular una solicitud o respuesta para alterar múltiples métodos y proporcionar propiedades definidas por el usuario. Api2.3 proporciona HttpServletRequestWrapper y HttpServletResponseWrapper para su implementación. Pueden enviar solicitudes y respuestas iniciales. Si desea cambiar las características de un método, se deben heredar los métodos Wapper y override. A continuación se muestra un filtro de registro simple que registra la duración de todas las solicitudes.
La clase pública LogFilter implementa el filtro {
Configuración de FilterConfig;
Public void setFilterConfig(filter config config){
this.config = config
}
configuración de filtro público getFilterConfig(){
Configuración de retorno;
}
vacío público hacer filtro (solicitud de solicitud de servlet,
ServletResponse res,
cadena de cadena de filtro) {
contexto de contexto de servlet = getFilterConfig(). getServletContext();
long bef = system . hora actual millis();
chain.doFilter(req, RES); //No se requieren parámetros de cadena aquí
long aft = system . hora actual millis();
context.log("Solicitud a"+ req.getRequestURI()
+":"+(aft- bef ));
}
}
Cuando el servidor llama a setfilterconfig(), el filtro guarda la información de configuración. El servletContext se obtiene a través de la información de configuración en el método doFilter(). Si desea ejecutar este filtro, debe configurarlo en web
Log//filter name
& lt/filter-name & gt; & ltfilter-class & gt;
LogFilter //clase de filtro (servlet en el ejemplo anterior)
& lt/filter-class & gt; lt/filter & gt;
& lt mapa de filtro>
< nombre de filtro>log</filter-name>
& ltservletname>servletname</servlet-name>
& lt/filter-mapping & gt;
& ltservlet & gt
& ltservlet-name & gt;servletname & lt/servlet name & gt;
& ltservletclass & gtservletclass & lt/servlet-class & gt;
& lt/servlet & gt;
& mapeo de ltservlet& gt
<servlet- name>servletname </servlet-name>
<url-pattern>* </URL-pattern>
< /servlet-mapping & gt;
Pon esto web.xml en web-inf (para obtener más detalles, consulte el documento de ayuda de Tomcat).
Cada vez que realiza una solicitud (como index.jsp), primero vaya a LogFilter y llame al método doFilter(), y luego vaya al servlet respectivo. Si fuera un servlet simple (solo una página sin declaraciones de salida), entonces la salida posible sería:
Solicitud de /index.jsp:10
El filtro sería A El componente COM consta de uno o más pines. Pin también es un componente COM. La extensión del archivo de filtro es . hacha, pero también podría serlo. dll. Los filtros se pueden dividir aproximadamente en tres categorías, dependiendo de si contienen pines de entrada o pines de salida (o su ubicación en el gráfico de filtros): filtros de origen (solo pines de salida), filtros de transformación (que contienen ambos pines de entrada y pines de salida). y filtros de renderizado (solo pines de entrada).
Normalmente, se utiliza un proyecto DLL Win32 común para crear filtros. Y los proyectos de filtrado generales no utilizan MFC. En este punto, la aplicación utiliza la función CoCreateInstance para filtrar la instancia; el filtro y la aplicación cooperan a nivel binario. Alternativamente, puede crear un filtro en el proyecto de aplicación de MFC. En este caso, no es necesario registrar el filtro como un componente COM, y la cooperación entre el filtro y la aplicación es a nivel de código fuente. Cree una instancia de filtro, en lugar de usar la función CoCreateInstance, cree un objeto de filtro directamente; , de la siguiente manera:
m _ pfilter object = new cfilter class();
//Hacer recuento inicial 1 que coincida con la creación de COM
m _ pFilterObject-& gt; AddRef() ;
Debido a que la clase base de Filter implementa el recuento de referencias de objetos, incluso en el segundo caso, la operación del objeto Filter creado puede cumplir completamente con el estándar COM.
El filtro es un módulo funcional independiente, es mejor no depender de otras DLL de terceros. Debido a que Filter tiene la transparencia de ubicación de COM, el archivo de filtro se puede colocar en cualquier lugar del disco duro, siempre que la ubicación se mueva y se vuelva a registrar. Pero en este momento, si el filtro depende de otras DLL, habrá problemas con la ubicación de la DLL por parte del filtro.
Sin un gráfico de filtro, los filtros no se pueden utilizar solos. Por lo tanto, si desea omitir el gráfico de filtro y utilizar directamente las funciones del módulo implementadas por el filtro, trasplante su filtro a DMO (DirectX Media Object). Otro punto para los desarrolladores de aplicaciones DirectShow: no olviden utilizar OleInitialize para la inicialización.
2. Registro del filtro
El filtro es un componente COM, por lo que debes registrarlo antes de usarlo. El programa de registro del filtro es regsvr32.exe. Si se proporciona el parámetro de línea de comando /u, significa cerrar sesión; si se proporciona /s, significa que no aparecerá el cuadro de diálogo que indica si el registro/cierre de sesión fue exitoso o fallido. Si desea registrar automáticamente un filtro durante la compilación de su proyecto, establezca las siguientes configuraciones en la página de compilación personalizada de la configuración del proyecto de VC:
Descripción: Registrar filtro
Comando: regsvr32 /s /c $(ruta de destino)
echo regsvr32 exe.time & gt$(directorio de destino)\$(nombre de destino). Entrenamiento
Salida: $(directorio de destino)\$(nombre de destino). Capacitación
La información de registro del filtro incluye dos partes: información COM básica e información del filtro. La información de registro se almacena en el registro. La ubicación del primero es: HKEY_class_root\clsid\filterclsid\, y la ubicación del segundo es:HKEY_class_root\clsid\category\instance\filterclsid\. La información COM indica que el filtro es un componente COM estándar que se puede crear a través de la función CoCreateInstance. La información del filtro indica la información que vemos a través de Graphedit que describe este filtro.
Si no desea que Graphedit vea (o permita que el enumerador de filtros encuentre) el filtro que escribió, no puede registrar la información del filtro en absoluto. Y no te preocupes, no afectarás en absoluto la funcionalidad del filtro.
El método para bloquear la información del filtro registrado también es muy sencillo. Porque CBaseFilter implementa dos funciones de la interfaz IAMovieSetup: registro y cancelación. Solo necesitamos sobrecargar estas dos funciones y devolver S_OK directamente.
El mérito del filtro. Este valor lo utiliza la función "Smart Connect" de Microsoft. En Graphedit, cuando agregamos un filtro de origen y realizamos un "Renderizado" en su pin, algunos filtros se conectan automáticamente. Los valores de mérito se refieren a lo siguiente:
MERIT_PREFERRED = 0x800000,
MERIT_NORMAL = 0x600000,
MERIT_UNLIKELY = 0x400000,
MERIT_DO_NOT_USE = 0x200000
Advantage_Software_Compressor = 0x100000,
Advantage_Hardware_Compressor = 0x100050
El valor de ventaja solo puede ser utilizado por "Smart Connection" si es mayor que MERIT_DO_NOT_USE; Cuanto mayor sea el mérito, mayor será la probabilidad de este filtro.
3. Proceso de conexión de pines entre filtros
Un filtro solo se agregará al gráfico de filtros y se conectará con otros filtros para formar un enlace completo. La conexión entre filtros (es decir, la conexión entre pines) es en realidad un proceso de negociación de tipo medio entre las dos partes. La dirección de conexión es siempre desde el pin de salida al pin de entrada. El proceso general de conexión es el siguiente: si se ha especificado el tipo de medio completo al llamar a la función de conexión, el tipo de medio se utilizará para conectarse y el proceso de conexión finalizará independientemente del éxito si no se especifica el tipo de medio; no especificado completamente, ingrese el siguiente proceso de enumeración. Enumere todos los tipos de medios en los pines de entrada que se conectarán y utilice estos tipos de medios para conectarse a los pines de salida uno por uno (si la función de conexión proporciona un tipo de medio incompleto, cada tipo de medio enumerado primero debe coincidir con él). La conexión entre los pines se declara exitosa si el pin de salida también acepta este tipo de medio; si no se admiten todos los tipos de medios enumerados en los pines de entrada y salida, se enumeran todos los tipos de medios en el pin de salida y se conectan los pines de entrada uno por uno. uno que utilice estos tipos de medios. Si el pin de entrada acepta uno de los tipos de medios, la conexión entre los pines también se declara exitosa; si no se admiten todos los tipos de medios en el pin de salida y en el pin de entrada, el proceso de conexión entre los dos pines fallará.
Cada pin puede implementar la función GetMediaType, proporcionando todos los tipos de medios preferidos admitidos en el pin (pero generalmente solo se implementa en el pin de salida, y el pin de entrada implementa principalmente CheckMediaType para ver si admite el MediaType actual proporcionado ). Durante el proceso de conexión, aquí se proporcionan todos los tipos de medios enumerados en el Pin.
Hay una variable miembro protegida m_bTryMyTypesFirst en la clase CBasePin y el valor predeterminado es falso. Podemos personalizar nuestro propio proceso de conexión cambiando el valor de esta variable a verdadero en el pin de salida del filtro personalizado (primero enumerando los tipos de medios en el pin de salida).
Cuando la conexión entre pines es exitosa, se llama a la función CompleteConnect en cada pin. Aquí podemos obtener información sobre el tipo de medio conectado y hacer algunos cálculos. Hay otra tarea importante en la implementación CompleteConnect del pin de salida, que es negociar la configuración de memoria utilizada para la transferencia de muestras después de ejecutar el gráfico de filtro. Este también es un proceso interactivo: primero pregunte sobre los requisitos de configuración en los pines de entrada. Si se proporciona un administrador de memoria para el pin de entrada, se usará primero el administrador de memoria del pin de entrada; de lo contrario, se usará el administrador de memoria producido por el propio pin de salida. Por lo general, necesitamos implementar DecideBufferSize para determinar el tamaño de la memoria para almacenar muestras. Nota: Una vez completada la negociación de este proceso, la memoria real no se asigna sino que espera una llamada de función activa en el pin de salida.
4. Descripción general de los tipos de medios filtrantes
Los tipos de medios suelen tener dos representaciones: AM_MEDIA_TYPE y CMediaType. El primero es una estructura y el segundo es una clase que hereda de esta estructura.
Cada tipo de medio consta de tres partes: tipo principal, subtipo y tipo de formato. Estas tres partes están identificadas de forma única mediante GUID. El tipo principal describe principalmente cualitativamente un tipo de medio, como especificar si es video, audio o transmisión; el subtipo refina aún más el tipo de medio. Si se usa video, puede especificar más UYVY o YUY2 o RGB24 o RGB32. Los tipos de formato refinan aún más los tipos de medios con estructuras.
Si las tres partes de un tipo de medio especifican un valor GUID específico, se dice que el tipo de medio está completamente especificado; si cualquiera de las tres partes del tipo de medio tiene un valor de GUID_NULL, significa que el tipo de medio no está completamente especificado. GUID_NULL actúa como carácter comodín.
Tipos profesionales más utilizados:
MEDIATYPE_Video
Media type_audio;
MEDIATYPE_AnalogVideo//Captura analógica
MEDIATYPE _ AnalogAudio
MEDIATYPE _ Texto
MEDIATYPE _ Midi
MEDIATYPE _ Stream
MEDIATYPE _ Interleaved// Cámara DV
tipo de medio _ mpeg 1 flujo del sistema;
MEDIATYPE _ MPEG2 _ PACK
MEDIATYPE _ MPEG2 _ PES
MEDIATYPE _ DVD _ ENCRYPTED _ PACK
MEDIATYPE _ DVD _ NAVEGACIÓN
Subtipos utilizados habitualmente:
MEDIASUBTYPE _ YUY2
MEDIASUBTYPE _ YVYU
p>MEDIASUBTYPE _ YUYV
MEDIASUBTYPE _ UYVY
MEDIASUBTYPE _ YVU9
subtipo de medio _ y 411;
MEDIASUBTYPE _ RGB4
MEDIASUBTYPE _ RGB8
MEDIASUBTYPE _ RGB565
MEDIASUBTYPE _ RGB555
MEDIASUBTYPE _ RGB24
MEDIASUBTYPE _ RGB32
MEDIASUBTYPE _ ARGB32//Contiene valor alfa
MEDIASUBTYPE _ Overlay
subtipo de medios _ mpeg 1 paquete;
subtipo de medios _ mpeg 1 carga útil; //Carga útil de video
subtipo de medios _ mpeg 1 carga útil de audio; //carga útil de audio
subtipo de medios _ mpeg 1 sistema // Carga válida de A/V
>media subtype_mpeg 1 videocd;
media subtype_mpeg 1 vídeo;
media subtype_mpeg 1 audio;
MEDIASUBTYPE _ Avi
MEDIASUBTYPE _ Asf
MEDIASUBTYPE _ QTMovie
MEDIASUBTYPE _ PCM
MEDIASUBTYPE _ WAVE
MEDIASUBTYPE _ dvsd// DV
MEDIASUBTYPE_dvhd
MEDIASUBTYPE_dvsl
MEDIASUBTYPE_MPEG2_VIDEO
MEDIASUBTYPE_MPEG2_PROGRAMA
MEDIASUBTYPE_MPEG2_TRANSPORT
MEDIASUBTYPE_MPEG2_Audio;
MEDIASUBTYPE_Dolby_AC3;
MEDIASUBTYPE_DVD_ S
UBPICTURE
subtipo de medios_DVD_LPCM_Audio;
subtipo de medios_DVD_NAVIGATION_PCI;
subtipo de medios_DVD_NAVIGATION_DSI;
Subtipo de medios_DVD_Navigation_Provider;
Formato común tipos:
Format_None
FORMAT_DvInfo DVINFO
Format_mpeg vídeo mpeg 1 información de vídeo
FORMAT_mpeg 2 vídeo mpeg 2 información de vídeo
FORMAT_video info encabezado de información de video
Formato _Información de video 2 Encabezado de información de video 2
Formato_Formato de forma de onda
Transmisión de datos entre filtros
Los datos entre filtros son transmisión de muestreo. Sample es un componente COM con su propio búfer de datos. Las muestras son gestionadas por el asignador.