Interceptáló szűrő programtervezési minta
Az interceptáló szűrő a Java EE egy programtervezési mintája. A minta cserélhető szűrőket hoz létre, hogy beavatkozzon általános szolgáltatásokba, anélkül, hogy a belső működés megváltozna. A szűrők kezelhetik a kéréseket és a válaszokat, előzetes vagy utólagos feldolgozást végezve. A szűrők módosíthatók vagy eltávolíthatók anélkül, hogy a kódon lényegi változtatásokat végeznének.[1] A minta átlátható újrafelhasználható feldolgozást végez azelőtt és azután, hogy a front és a lapvezérlők működésbe lépnének.[2]
Szerkezete
Komponensei a szűrőkezelő, szűrőlánc, szűrők és a célpont.
A szűrőkezelő vezérli a szűrési folyamatot, létrehozza a szűrőláncot a szükséges szűrőkkel a megfelelő sorrendben, és kezdeményezi a feldolgozást.[1]
A szűrőlánc független szűrők rendezett együttese.[1]
A szűrők egymástól függetlenül alkalmazhatók a célpontra. Az általuk végzett feldolgozást a szűrőlánc koordinálja.[1]
A célpont a kliens által igényelt erőforrás.[1]
Előnyei és hátrányai
A minta alkalmazása a következő előnyökkel és hátrányokkal jár:
- Újrafelhasználhatóság javítása: A szűrők és a központi egység egymástól függetlenül kezelhetők, cserélhetők, újrafelhasználhatók
- Rugalmasság növelése: A szűrők és a központ különálló egység[1][2]
- Hosszú szűrőláncok lelassíthatják a programot, és az áttekinthetőséget is rontják.[2]
Példa kód
A példa kód Javában készült. A szűrő általános, feldolgozást nem végez.
A szűrő:
public class DebuggingFilter implements Processor { private Processor target; public DebuggingFilter(Processor myTarget) { target = myTarget; } public void execute(ServletRequest req, ServletResponse res) throws IOException, ServletException { //Do some filter processing here, such as // displaying request parameters target.execute(req, res); } }
[1]
Központi egység:
public class CoreProcessor implements Processor { private Processor target; public CoreProcessor() { this(null); } public CoreProcessor(Processor myTarget) { target = myTarget; } public void execute(ServletRequest req, ServletResponse res) throws IOException, ServletException { //Do core processing here } }
[1]
Kérések feldolgozása:
public void processRequest(ServletRequest req, ServletResponse res) throws IOException, ServletException { Processor processors = new DebuggingFilter( new AuthenticationFilter(new CoreProcessor())); processors.execute(req, res); //Then dispatch to next resource, which is probably // the View to display dispatcher.dispatch(req, res); }
[1]
Szűrőkezelő:
public void processRequest(ServletRequest req, ServletResponse res) throws IOException, ServletException { Processor processors = new DebuggingFilter( new AuthenticationFilter(new CoreProcessor())); processors.execute(req, res); //Then dispatch to next resource, which is probably // the View to display dispatcher.dispatch(req, res); }
[1]
Szűrőlánc:
public class FilterChain { // filter chain private List<Filter> myFilters = new ArrayList<>(); // Creates new FilterChain public FilterChain() { // plug-in default filter services for example // only. This would typically be done in the // FilterManager, but is done here for example // purposes myFilters.add(new DebugFilter()); myFilters.add(new LoginFilter()); myFilters.add(new AuditFilter()); } public void processFilter( javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException { Filter filter; // apply filters for (final Filter filter : filters) { // pass request & response through various // filters filter.execute(request, response); } } }
[1]
Jegyzetek
- ↑ a b c d e f g h i j k Core J2EE Patterns - Intercepting Filter. Oracle . Oracle. (Hozzáférés: 2016. február 6.)
- ↑ a b c Kayal, D.. Pro Java EE Spring Patterns. New York: Apress, 98–106. o. (2008)
Fordítás
Ez a szócikk részben vagy egészben az Intercepting filter pattern című angol Wikipédia-szócikk fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.