Java >> Java opplæring >  >> Java

Eksempel på Java EE Filter Design Pattern

1. Introduksjon

Hei Java Code Geeks fan! Denne artikkelen handler om et eksempel på et Java EE-filterdesignmønster. Filtermønsteret brukes mye i Java EE. Det er mest brukt i kombinasjon med servlets. Servlets opererer i weblaget og håndterer HTTP-forespørsler og svar. Filtrenes rolle er å utføre noen nyttige handlinger mot forespørsler og svar.

2. Verktøy og krav

  1. Java 8
  2. WildFly 14.0.1
  3. Eclipse Oxygen
  4. Eclipse med WildFly og JBoss Tools Eksempel

Kilden i dette eksemplet er basert på Java EE Web Project i Red Hat Central. Vi vil ikke gå gjennom detaljene for å sette opp prosjektet, så det anbefales at Eclipse med WildFly og JBoss Tools Eksempel leses før du prøver ut eksemplet. Vi kommer til å bruke WildFly 14.0.1 fordi det er en Java EE 8 fullplattformkompatibel implementering.

3. Java EE Filter Design Pattern Implementering

Et servletfilter må implementere javax.servlet.Filter grensesnitt og tilhørende metoder. I eldre versjoner var det nødvendig å implementere init metoden, doFilter metoden og destroy metode. Heldigvis, i Java EE 8, trenger vi bare å implementere doFilter fordi de andre er merket som default . doFilter metoden er der all magien skjer.

4. @WebFilter

Importer java-ee-filtern-pattern prosjekt i Eclipse. Opprett pakken org.jboss.examples.filter og legg til LogFilter klasse.

LogFilter.java

package org.jboss.tools.examples.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;

@WebFilter(filterName = "loggingFilter", urlPatterns ="/index.jsf/*")
public class LogFilter implements Filter {

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		HttpServletRequest httpRequest = (HttpServletRequest) request;

		System.out.println("LOG: " + httpRequest); // method + URI

		chain.doFilter(request, response);

	}

}

I vår metode får vi tilgang til HTTP-forespørselen og svarforekomstene. Vi kan da bruke hvilken som helst logikk vi ønsker på den. I dette eksemplet skriver vi det bare ut til standard utskrift. Men vi kan gjøre mer enn bare logge ting. Vi kan gjøre autentiseringskontroller, komprimering og så videre. Filtre kan lenkes sammen for å gi fortløpende funksjonalitet. Dette er grunnen til at vi har chain.doFilter . Vi sørger for at forespørselen og svaret sendes videre til neste filter eller til målservleten. Servleten utfører sin logikk og når den er ferdig, sendes utføringen tilbake opp filterkjeden gjennom filteret, deretter tilbake til klienten.

Vi konfigurerte filteret vårt med @WebFilter merknad. Det er en merknad på klassenivå. De vanligste alternativene er navn, URL-mønster og målservlets. For flere alternativer, sjekk ut Javadocs av ​​WebFilter.

Når vi kjører denne nettappen (Kjør som -> Kjør på server, WildFly 14.0.1), vil vi se noe slikt i konsollutgangen:

Konsollutgang

11:32:39,438 INFO  [org.jboss.as.server] (DeploymentScanner-threads - 2) WFLYSRV0016: Replaced deployment "java-ee-filter-pattern.war" with deployment "java-ee-filter-pattern.war"
11:53:48,671 INFO  [stdout] (default task-2) LOG: HttpServletRequestImpl [ GET /java-ee-filter-pattern/index.jsf ]

Hvis du ikke ser noe lignende ovenfor, prøv å laste inn siden på nytt.

5. web.xml

Hvis vi har mer enn ett filter i filterkjeden, bør de defineres i web.xml . Rekkefølgen for utførelse er rekkefølgen de vises i i web.xml fil. La oss legge til et nytt filter for å logge REST-forespørsler.RestFilter.java

package org.jboss.tools.examples.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;

@WebFilter(filterName = "loggingFilter", urlPatterns ="/rest/members/*")
public class RestFilter implements Filter {

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		HttpServletRequest httpRequest = (HttpServletRequest) request;

		System.out.println("REST: " + httpRequest); // method + URI

		chain.doFilter(request, response);

	}

}

Det er mer eller mindre det samme som vårt første filter bortsett fra konsollmeldingen som er "REST" og URL-mønsteret.

Deretter legger vi til følgende linjer i vår web.xml .

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app
	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
	version="3.1"
>
	<!-- Filters. NOTE: ordering of filter-mapping matters! -->

 	<filter>
		<filter-name>logFilter</filter-name>
		<filter-class>org.jboss.tools.examples.filter.LogFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>logFilter</filter-name>
		<url-pattern>/index.jsf/*</url-pattern>
	</filter-mapping>
	 
	<filter>
		<filter-name>restFilter</filter-name>
		<filter-class>org.jboss.tools.examples.filter.RestFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>restFilter</filter-name>
		<url-pattern>/rest/members/*</url-pattern>
	</filter-mapping>

</web-app>

Når vi kjører nettappen vår, vil vi se "LOG" og "REST" meldingene (forespørselen og svaret sendes videre til neste filter), men etter å ha klikket på REST URL, vil vi bare se "REST" meldingen. Dette er fordi det ikke samsvarer med URL-mønsteret til loggfilteret lenger.

Konsollutgang

12:45:38,101 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Full 14.0.1.Final (WildFly Core 6.0.2.Final) started in 7224ms - Started 494 of 666 services (328 services are lazy, passive or on-demand)
12:45:49,437 INFO  [stdout] (default task-1) LOG: HttpServletRequestImpl [ GET /java-ee-filter-pattern/index.jsf ]

12:45:49,437 INFO  [stdout] (default task-1) REST: HttpServletRequestImpl [ GET /java-ee-filter-pattern/index.jsf ]

12:45:49,802 INFO  [org.hibernate.hql.internal.QueryTranslatorFactoryInitiator] (default task-1) HHH000397: Using ASTQueryTranslatorFactory
12:49:06,356 INFO  [stdout] (default task-1) REST: HttpServletRequestImpl [ GET /java-ee-filter-pattern/rest/members/0 ]

12:49:06,357 INFO  [stdout] (default task-1) REST: HttpServletRequestImpl [ GET /java-ee-filter-pattern/rest/members/0 ]

6. Java EE Filter Design Pattern Sammendrag

Der har du det. Nå vet du det grunnleggende om filtermønsteret i Java EE. Implementer filtergrensesnittet og merk klassen med @WebFilter . Hvis du har mer enn ett filter, oppgi i den rekkefølgen du vil at de skal kalles i web.xml . Enkelt!

7. Last ned kildekoden

Dette er et eksempel på Java EE Filter Design Pattern.design-mønstre

Java Tag