Apache Tomcat 7 Servlet API 3.0 (7.0.6 Release)
Transcription
Apache Tomcat 7 Servlet API 3.0 (7.0.6 Release)
Mein Rucksack Apache Tomcat 7 Servlet API 3.0 (7.0.6 Release) • Peter Roßbach [email protected] Peter Roßbach • • • Freiberuflicher IT-Systemarchitekt, Berater, Trainer und Autor • • • • Entwickler im Apache Tomcat Projekt Mitglied der Apache Software Foundation Webexperte Autor der TomC@Kolumne im Java Magazin Autor • • • http://tomcat.objektpark.org/ Buch Tomcat 4x und Java Server und Servlets E-Mail : [email protected] Fachautor und Speaker auf deutschen Java Konferenzen © 2011 Peter Roßbach ([email protected]) Was gibt es Neues? • • • JSP API 2.2 ( Expression Language 2.2) JSR 254 • Apache Tomcat 7.0.6 Release ist fertig Standard Taglib Projekt (JSTL) ist nun Teilprojekt des Apache Tomcat Projekts • • offizielle Test (TCK) zu 100% erfolgreich Redesign und Refactoring abgeschlossen • • Integration JEE 6 Web Profile • • • • • Projekt wächst Servlet API 3.0 Support ( JSR 315) • • • 2 Geronimo 3 ,OpenEJB 3.1.2, MyFaces 2 (Dev) JBOSS 6/7 und JBoss Web 3 • Eclipse 3.6 - WTP 2.2 JSTL 1.0, 1.1 und 1.2 24 Entwickler im Apache Tomcat Projekt! http://wiki.apache.org/tomcat/PoweredBy • • SIwpas-1.0.0-CR4 http://tomcat.apache.org/taglibs/ 94 Referenz Unternehmen 32 Hosting Provider ca. 10 Mio Downloads Tomcat 6 als Basis im neuen Amazon Beanstalk Service © 2011 Peter Roßbach ([email protected]) 3 © 2011 Peter Roßbach ([email protected]) 4 History 1997 1999 2000 2001 2002 2003 2004 2005 Web Container API‘s 2006 2007 2008 2009 Tomcat Architektur 2010 2011 Servlet Api 0.x-2.1 JSP 0.4-1.0 tomcat ref Servlet Api 2.2 + JSP 1.0 3.0 3.1 3.2 3.2.4 X jserv 3.3 3.3.2 3.3.trunk X Catalina Architektur tomcat.next 4.0 Servlet JSP Tomcat Java 3.0 2.2 7.0.x 1.6 2.5 2.1 6.0.x 1.5 2.4 2.0 5.0.x & 5.5.x 1.4 2.3 1.2 4.0.x & 4.1.x 1.3 2.2 1.1 3.2.x & 3.3.x 1.2 Servlet Api 2.3 JSP 1.1-1.2 4.0.6 X 4.1 4.1.10 4.1.31 5.0 5.0.19 5.0.27 5.5 5.5.12 4.1.34 4.1.36 4.1.37 X Servlet Api 2.4 JSP 2.0 5.0.trunk 5.5.20 5.5.25 X 5.5.27 5.5.28 5.5.31 ServletAPI 2.5 JSP 2.1 6.0 6.0.10 6.0.15 6.0.18 6.0.26 6.0.31 ServletAPI 3.0 JSP 2.2 7.0 7.0.0 © 2011 Peter Roßbach ([email protected]) 5 7.0.6 © 2011 Peter Roßbach ([email protected]) Servlet API 3.0 • • • • • • • • • • • • Web-Fragement Ressourcen Asynchrone Kommunikation Server Push Entkoppelung vom Container Thread File Upload direkt im Container Alle Connectoren haben den Async Support 7 Effizient nur mit NIO oder APR Connectoren Alle Connectoren nutzen nun die Executor ThreadPools MemoryLeakDetection für Anwendungsredeployment Deployment von Anwendungsversionen Einige Packages oder Komponenten sind verschoben CRSR Prevention Filter (s. Manager Anwendung) Module für eigenen JDBC Pool und Bayeux Implementierung Embedded und Unit testen mit Tomcat • • Session und Cookie Handling verbessert © 2011 Peter Roßbach ([email protected]) Neues Lifecycle API der Komponenten (JMX Update) • Modularität der Anwendung und des Containers verbessern • • • • Apache Tomcat 7 Basis Programmierung mit Annotationen • • 6 org.apache.catalina.startup.TomcatBaseTest org.apache.catalina.startup.Tomcat © 2011 Peter Roßbach ([email protected]) 8 Neuer Start Screen Servlet API 3.0 • • • • © 2011 Peter Roßbach ([email protected]) 9 Neue Möglichkeiten API 3.0 • API für Servlet/Filter/Listener am ServletContext Modularisierung der web.xml: „Ein Framework bzw. JAR kann ein Stück der gesamten web.xml Konfiguration enthalten.“ META-INF/web.xml in jedem Jar (WEB-INF/lib/*.jar) möglich • web-fragment Element definieren Servlets, Filters, Listeners und ... © 2011 Peter Roßbach ([email protected]) Async Servlet Support Kleinere Erweiterungen ... • • File Upload Session Tracking © 2011 Peter Roßbach ([email protected]) 10 @WebFilter(”/myServlet/*“) public class MyFilter extends Filter{ public void doFilter(req,res) {} } Annotationen von Servlets/Filter/Listener ... • Vereinfachung des Deployments Annotations Integration von Web-Frameworks ohne weitere Konfiguration in der Datei web.xml. • • • Programmatischen und modulare Erweiterbarkeit @WebServlet(“/myServlet”) public class MySampleServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) {} } 11 © 2011 Peter Roßbach ([email protected]) 12 ServletFilter import import import import import weitere Beispiele javax.servlet.FilterChain; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse; javax.servlet.http.annotation.FilterMapping; javax.servlet.http.annotation.WebFilter; @WebServlet(name= "MyServlet", urlPatterns={"/foo", "/bar"}) public class SampleUsingAnnotationAttributes extends HttpServlet{ @WebFilter("/myservlet/*") public class SetCharacterEncodingFilter implements Filter { .... public void doFilter (HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws java.io.IOException, javax.servlet.ServletException { // Conditionally select and set the character encoding to be used if (ignore || (request.getCharacterEncoding() == null)) { String encoding = selectEncoding(request); if (encoding != null) request.setCharacterEncoding(encoding); } public void doGet(HttpServletRequest req, HttpServletResponse res) { } } @WebServlet(value="/foo", initParams = { @WebInitParam(name=“debug“,value=“true“) } ) public class SampleUsingAnnotationAttributes extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) { } } chain.doFilter(request, response); } } © 2011 Peter Roßbach ([email protected]) 13 Annotations web.xml • @WebServlet(name,urlPatterns,value, load-on-startup,description,smallIcon,largeIcon,asyncSupported) • @WebFilter(display-name, filter-name,description,smallIcon,largeIcon,urlPatterns,servlet-names, dispatcher-types,value, asyncSupported) • • • • © 2011 Peter Roßbach ([email protected]) 14 Eclipse Java Annotation Support dispatcher-types ERROR,FORWARD,INCLUDE,REQUEST,ASYNC @WebFilter(value = "/param", filterName = "paramFilter", dispatcherTypes = { DispatcherType.ERROR, DispatcherType.ASYNC }, initParams = { @WebInitParam(name = "message", value = "Servlet says: ") }) @WebInitParam(description,name,value) @WebListener(description) © 2011 Peter Roßbach ([email protected]) 15 © 2010 Peter Roßbach ([email protected]) 16 Annotation Overwrite • Disable Servlet Deklaration in der web.xml überschreibt Konfiguration in der Annotation • nur urlPatterns der web.xml gelten, sonst die der Annotation • initParameter werden durch Deskriptor überschrieben oder durch Annotation ergänzt • <!-- Disable this servlet --> <enabled>false</enabled> Ergänzung der Werte durch die Annotation, wenn nicht im Deskriptor explizit definiert. © 2011 Peter Roßbach ([email protected]) <servlet> <servlet-name>param</servlet-name> <servlet-class>annotation.ParamServlet</servlet-class> <init-param> <param-name>foo</param-name> <param-value>hello</param-value> </init-param> <init-param> <param-name>bar</param-name> <param-value>peter</param-value> </init-param> </servlet> 17 18 © 2011 Peter Roßbach ([email protected]) WebSecurity Constraint Listener @WebServlet("/security") @ServletSecurity((httpMethodConstraints = { @HttpMethodConstraint( value = "GET", rolesAllowed = {"user", "manager"}), @HttpMethodConstraint( value = "POST", rolesAllowed = "manager", transportGuarantee = TransportGuarantee.CONFIDENTIAL) }) @WebListener(description="init fine tricks") public class MyListener implements ServletContextListener { public void contextInialized(ServletContextEvent event) { ... } public void contextDestroy(ServletContextEvent event) { ... } } public class SecurityServlet extends HttpServlet { ... } © 2011 Peter Roßbach ([email protected]) 19 © 2011 Peter Roßbach ([email protected]) 20 ServletContext.addServlet ServletContext.addFilter @WebListener public class MyListener implements ServletContextListener{ public void contextInitialized (ServletContextEvent sce) { ServletContext servletContext = event.getServletContext(); ServletRegistration reg = servletContext.addServlet("Hello", HelloApiServlet.class); reg.addMapping("/hello2"); @WebListener public class MyListener implements ServletContextListener { public void contextInitialized (ServletContextEvent sce) { ServletContext servletContext = event.getServletContext(); FilterRegistration freg = servletContext.addFilter("helloFilter", ParamFilter.class); Map<String,String> initParameters = new HashMap<String,String>(); initParameters.put("foo", "bar"); reg.setInitParameters(initParameters); freg.addMappingForUrlPatterns( EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC), true, "/hello2", "/param"); } ... } } } © 2011 Peter Roßbach ([email protected]) 21 © 2011 Peter Roßbach ([email protected]) ServletContext Annotations 3.0 • Voraussetzung in WEB-INF/web.xml • <metadata-complete>false<metadata-complete> • Es müssen alle Klassen in WEB-INF/classes und WEB-INF/lib/*.jar untersucht werden. • Erweiterung im Tomcat • JarScanner Konfiguration im Context • • 23 <Context> <JarScanner className="org.apache.tomcat.util.scan.StandardJarScanne r" scanClassPath= "true" /> </Context> Deny System Property • © 2011 Peter Roßbach ([email protected]) 22 -Dtomcat.util.scan.DefaultJarScanner.jarsToSkip= "logging-api.jar,admin.jar" © 2011 Peter Roßbach ([email protected]) 24 Servlet API 3.0: web-fragment • Ressoure Loading jar:/WEB-INF/lib/hello.jar!/META-INF/web-fragment.xml <web-fragment> <servlet> <servlet-name>welcome</servlet-name> <servlet-class> WelcomeServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>welcome</servlet-name> <url-pattern>/Welcome</url-pattern> </servlet-mapping> ... </web-fragment> • Anwendung modularisieren • WEB-INF/lib/<fragments>.jar!META-INF/ resources • • • 25 © 2011 Peter Roßbach ([email protected]) Servlets, Filter, Listener Konfigurationen: web-fragments.xml Ressourcen 26 © 2011 Peter Roßbach ([email protected]) War resources.jar resources.jar war anno.ServletA resourceA.jsp resourceC.jsp folder META-INF WEB-INF resources resourceE.jsp lib resourceA.jsp resources.jar web-fragment.xml web.xml folder resourceB.jsp resources2.jar resourceD.jsp © 2011 Peter Roßbach ([email protected]) 27 © 2011 Peter Roßbach ([email protected]) resourceC.jsp 28 resource2.jar ServletContainerInitializer • resources2.jar anno.ServletA Unterstützung des JDK 6 JAR Service API • META-INF/services/javax.servlet.ServletContainerInitializer • • META-INF Name der Klassen ServletContainerInitializer für dieses Jar Bekommt alle Klassen aus allen „Jars“ die Klassen HandlesTypes implementieren. • resources resourceF.jsp web-fragment.xml • Beispiele: Mojarra(JSF RI) und Jersey (JAX-RS) @HandlesTypes(AnnotationA.class) AServletContainerInitializer implements ServletContainerInitializer { public void onStartup(Set<Class<A>> c, ServletContext ctx) throws ServletException { // framework setup Servlets/Filter/Listener ServletRegistration reg = ctx.addServlet("AServlet", "com.foo.AServlet"); reg.addServletMapping("/foo"); ... } folder resourceC.jsp © 2011 Peter Roßbach ([email protected]) Berücksichtigung der WebFragment Ordering 29 Module ausserhalb der WebApp 30 © 2011 Peter Roßbach ([email protected]) Plugins(aliases, JAR‘s) <Context aliases="/content=${catalina.base}/content"> webapps contents <apps1>.war apps1/static aliases <JarScanner scanClassPath="true" /> /static=contents/apps1/static <Loader className="org.apache.catalina.loader.VirtualWebappLoader" virtualClasspath="${catalina.base}/admin/lib/hello2.jar" /> </Context> WEB-INF/lib/*.jar apps1/lib/*.jar VirtualWebappLoader virtualClasspath="${catalina.base}/app1/lib/*.jar © 2011 Peter Roßbach ([email protected]) 31 © 2011 Peter Roßbach ([email protected]) 32 Web-Plugins? Ladereihenfolge • Reihenfolge 1. Zuerst werden die Informationen der WEB-INF/ web.xml geladen • • • • Beim Undeploy der Anwendung bleiben die Plugins erhalten. 2. Dann werden die web-fragmente.xml geladen Bei Context allowLinking= "true" werden die Inhalte der Links mit gelöscht, da sie vollwertige Bestandteile der Anwendung für den Tomcat sind. • • • evtl. ServletContainerInitializer ausgewertet ServletContextListener Event Handling (1. oder 3.) • 33 Ordnung... • Absolute Ordnung • • web.xml => <absolute-ordering> Relative Ordnung • web-fragment.xml => <ordering> absolute oder relative Ordering! 3. Dann werden die Annotations ausgewertet Integration von Ressourcen und Funktionserweiterung sind nun sehr elegant unterstützt. © 2011 Peter Roßbach ([email protected]) Tomcat lädt noch conf/web.xml! addServlets and addFilters + Mappings © 2011 Peter Roßbach ([email protected]) 34 Weitere Ressourcen laden... <web-app> <name>MyApp</name> <absolute-ordering> <name>MyFragment3</name> <name>MyFragment2</name> </absolute-ordering> ... </web-app> <web-app> <name>MyApp</name> <absolute-ordering> <name>MyFragment3</name> <name>MyFragment2</name> <others/> </absolute-ordering> ... </web-app> <web-fragment> <name>MyWebFragment1</name> <ordering> <!-- Ingore as absolute ordering exists --> <before>MyWebFragment2</before> <after></others></after> </ordering> </web-fragment> © 2011 Peter Roßbach ([email protected]) 35 © 2011 Peter Roßbach ([email protected]) 36 Konflikte • • • metadata-complete API metadatacomplete Annotations bzw. Fragments 2,5 true NEIN Bei Konflikten gewinnt der Eintrag in der web.xml. 2,5 false JA Konflikte zwischen Elemente verschiedener webFragments führen zu einem Fehler und die Anwendung ist nicht verfügbar! 3,0 true NEIN 3,0 false JA Es wird im Prinzip ein grosser Merge durchgeführt. • Ergebnis im ServletContext Attribute „org.apache.tomcat.util.scan.MergedWebXml“ • Es gibt additive Elemente wie <context-param> und <init-param>! 3.0 Notation: <web-app> <metadata-complete>false<metadatacomplete>... • Tomcat log: <Context logEffectiveWebXml="true" /> 2.5 Notation: <web-app metadata-complete=“false“> • Ausgabe der web.xml mit dem Merge-Resultat! © 2011 Peter Roßbach ([email protected]) 37 © 2011 Peter Roßbach ([email protected]) SessionTracking Session Markierung • public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); Cart cart = (Cart)session.getValue(“cart”); // ... // do logic to get the inventory number and // quantity of goods that user wants to add to cart • • cart.addItem(inventoryNumber, quanity); } • © 2011 Peter Roßbach ([email protected]) 38 39 Bisher: • • Cookie ( JSESSIONID) URL- Paramater ( jsessionid) ab 3.0 kann Namen der Parameter im Container geändert werden. ab Tomcat 6.0.20 • • -Dorg.apache.catalina.SESSION_COOKIE_NAME=JSESSIONID -Dorg.apache.catalina.SESSION_PARAMETER_NAME=jsessionid ab mod_jk 1.2.28 ( worker.lb.session_cookie=JSESSIONID und worker.lb.session_path=;jsessionid © 2011 Peter Roßbach ([email protected]) 40 SessionCookieConfig • • SessionTrackingModes Voreinstellung der SessionCookie Information • SessionCookieConfig( String!domain, String path, String!comment, boolean!isHttpOnly, boolean!isSecure) @WebListener public class MyListener implements ServletContextListener { public void contextInitialized (ServletContextEvent sce) { ServletContext context = sce.getServletContext(); SessionCookieConfig scc = new SessionCookieConfig( „my.domain“,context,“/jup“,true, false) ; context.setSessionCookieConfig(scc); setSessionTrackingModes (java.util.EnumSet<SessionTrackingMode>!sessionTrackingModes) • • • SessionTrackingMode.COOKIE (default) SessionTrackingMode.URL (default) SessionTrackingMode.SSL @WebListener public class MyListener implements ServletContextListener { public void contextInitialized (ServletContextEvent sce) { ServletContext context = sce.getServletContext(); context.setSessionTrackingMode(EnumSet.of (SessionTrackingMode.COOKIE, SessionTrackingMode.URL, SessionTrackingMode.SSL)); } } © 2011 Peter Roßbach ([email protected]) 41 © 2011 Peter Roßbach ([email protected]) Async Servlet Asynchron IO Die berücksichtigten Use Cases für Asynchronität sind -Server Side AJAX Push per Comet - Asynchrone Web Services und Web Proxies - Ermöglicht non-blocking Verhalten des Containers bei langen Requests • Aktueller Stand entspricht einer Entkoppelung des Container Request Threads von der Bearbeitung von Request und Response • Was ist der Asynch IO in der Servlet Spec nicht? Erweiterung von ServletRequest um folgende Methoden addAsyncListener(AsyncListener listener) addAsyncListener(AsyncListener listener, ServletRequest req, ServletResponse res) getAsyncContext() startAsync() oder startAsync(ServletRequest req, ServletResponse res) © 2011 Peter Roßbach ([email protected]) 42 43 • • Eine Non Blocking IO Implementierung Warum? • • Problem mit der Rückwärtskompatibilität Bewusst ein komplexes Programmiermodel vermieden © 2011 Peter Roßbach ([email protected]) 44 AsyncSupport AsyncSupport @WebFilter(value=“/hello“, asyncSupported=true) public class myFilter implements Filter {} interface javax.servlet.ServletRequest { AsyncContext startAsync(); AsyncContext startAsync(Request,Response); } @WebServlet(value=“/hello“,asyncSupported=true) public class myServlet extend HttpServlet {} 45 © 2011 Peter Roßbach ([email protected]) throws IllegalStateException wenn isAsyncSupported() returns false Besser.... Async Beispiel @WebServlet(value = "/simple", asyncSupported = true) public class SimpleDispatch extends HttpServlet { protected void service(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException { if (null == req.getAttribute("dispatch")) { resp.setContentType("text/plain"); AsyncContext actx = req.startAsync(); actx.setTimeout(Long.MAX_VALUE); Runnable run = new Runnable() { public void run() { try { req.setAttribute("dispatch", System .currentTimeMillis()); Thread.currentThread().setName("Simple-Thread"); Thread.sleep(2 * 1000); actx.dispatch(); } catch (Exception x) {} } }; actx.start(run); //Thread t = new Thread(run); //t.start(); } else { resp.getWriter().write( "Simple request start at" + req.getAttribute("dispatch") + " and dispatch worked at" + System.currentTimeMillis() + "\n"); req.getAsyncContext().complete(); } } } Peter Roßbach ([email protected]) © 2011 46 © 2011 Peter Roßbach ([email protected]) service(Request req, Response res) { if (req.isAsyncSupported()) { AsyncContext actx = req.isAsyncStarted()? req.getAsyncContext(): req.startAsync(); ... } else { ... } } 47 © 2011 Peter Roßbach ([email protected]) 48 Listener von ServletRequest • Timeout Registriere einen AsyncListener für Complete und Timeout • • void addAsyncListener(AsyncListener!listener) void addAsyncListener(AsyncListener!listener, ServletRequest!servletRequest, ServletResponse!servletResponse) • • • Bestückung mit Wrapper Wenn kein Timeout explizit gesetzt ist, gilt im Tomcat das Timeout des Connectors • • asyncContext.setTimeout(long!timeout) interface javax.servlet.AsyncListener { • void onComplete(AsyncEvent event) Datei server.xml: <Connector asyncTimeout=“30000“ ... Besser immer ein programmatisches Timeout in der eigenen Anwendung setzen: • void onTimeout(AsyncEvent event) ... Default 10 sec asyncContext.setTimeout("15000"); } 49 © 2011 Peter Roßbach ([email protected]) dispatch 50 Beispiel Forward service(Request req, Response res) { final AsyncContext acontext = req.startAsync(); Runnable runnable = new Runnable() { public void run() { Message m = jmsListener.receive(); req.setAttribute(“quote”,m); //Neuer Container Thread wird gestartet acontext.dispatch(“/stock/quote.jsp”); } }; executor.submit(runnable); // Ende des bestehenden Container Threads // Kein Recycle oder Close des Request/Response! } interface javax.servlet.AsyncContext { void dispatch(); void dispatch(String path); void dispatch(ServletContext ctx, String path) ... } Es wird ein Container Thread genutzt oder gestartet! Path muss mit ,/‘ starten und ist relative zum ServletContext © 2011 Peter Roßbach ([email protected]) © 2011 Peter Roßbach ([email protected]) 51 © 2011 Peter Roßbach ([email protected]) 52 Async Dispatch Attribute • • • • • AsyncContext javax.servlet.async.request_uri javax.servlet. async.context_path javax.servlet. async.servlet_path javax.servlet. async.path_info javax.servlet. async.query_string 53 © 2011 Peter Roßbach ([email protected]) File Upload • • • 54 © 2011 Peter Roßbach ([email protected]) Part Anfrage ist vom Type „multipart/form-data“ Neue Methoden am HttpServletRequest public Iterable<Part> getParts() public Part getPart(String name) Annotation MultipartConfig erforderlich • • @WebServlet(name="upload") @MultipartConfig(location="temp", fileSizeThreshold="8196", maxFileSize="10485760", maxRequestSize="10485760") public class myUploadServlet extend HttpServlet {} © 2011 Peter Roßbach ([email protected]) 55 © 2011 Peter Roßbach ([email protected]) 56 Weiteres MemoryLeaks • • • • • • • • • Memory Leak Detection Connectoren nutzen alle die Executor Threadpools Module • • JDBC 4 DataSource Pool • Comet Bayeux Implementierung 57 Falsche Nutzung von Threads Falsche Nutzung von ThreadLocals Risiko Shared Libs (JDBC DriverRegistration, Log API) Löschen von statischen Referenzen um den Speicherverbrauch des Lochs zu verkleinern Server Listener: JreMemoryPreventionListener • • AccessLogging von allen Requests und Async © 2011 Peter Roßbach ([email protected]) http://wiki.apache.org/tomcat/MemoryLeakProtection ab Tomcat 6.0.24 Behandelt JDK API‘S die nicht innerhalb eines WebAppCLassLoader instanziert werden dürfen. © 2011 Peter Roßbach ([email protected]) Konfiguration Beispiele probieren... <Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.core.JasperListener"/> <Listener className= "org.apache.catalina.core.JreMemoryLeakPreventionListener"/> <GlobalNamingResources> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" readonly="true"/> </GlobalNamingResources> <Service name="Catalina"> <Connector port="8080"/> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase" /> <Host name="localhost" appBase="webapps" /> </Engine> </Service> </Server> © 2011 Peter Roßbach ([email protected]) 58 59 • <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> • neue Attribute im Context • clearReferencesStatic=true • • clearReferencesStopThreads=true • • Löschen aller Threads die in der Anwendung gestartet sind. clearReferencesThreadLocals=true • • Löschen aller public static‘s Lösche aller ThreadLocals Entries die vom ClassLoader noch referenziert sind. unloadDelay=2000 © 2011 Peter Roßbach ([email protected]) 60 Thread Leaks... • webapp - Versionen Konfiguration in der server.xml, bzw context.xml <Server ...> <Listener className=“org.apache.catalina.core. ThreadLocalLeakPreventionListener“/> <Context renewThreadsWhenStoppingContext=“true“ ...> • Nach dem Undeploy einer Anwendung werden alle aktiven Thread der beteiligten Executors erneuert, wenn Sie das nächste Mal in den Pool zurückkommen. • Dies verhindert effektiv versteckte Memory-Problem mit ThreadLocals die beim Undeployment der Anwendung nicht bereinigt werden. © 2011 Peter Roßbach ([email protected]) 61 Context Path Context Version Context Name Base filename /foo None /foo foo /foo/bar None /foo/bar foo#bar Empty String None Empty String ROOT /foo 42 /foo##42 foo##42 /foo/bar 42 /foo/bar##42 foo#bar##42 Empty String 42 ##42 ROOT##42 © 2011 Peter Roßbach ([email protected]) Versioniertes Deployment Fazit: Deployment • • SubContext ist auch im Tomcat 6.0.x vorhanden (app#moduleA). Mit Tomcat 7.0.6 kommt das versionierte Deployment hinzu. • • • • © 2011 Peter Roßbach ([email protected]) 62 63 Session sind immer fest einer Version zugeordent. Neue Session werden in der neuste Version gestartet, wenn diese aktive ist. Versionierte oder Submodule sind eigenen vollständige Anwendungen. Kombinierbar mit alle Servlet API 3.0 Eigenschaften und den Besonderheiten eines Tomcat 7 Context. © 2011 Peter Roßbach ([email protected]) 64 Combined Relam Realm • Mehrere Authenfikations-Quellen • • • • <Realm className="org.apache.catalina.realm.CombinedRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> <Realm className="org.apache.catalina.realm.DataSourceRealm" dataSourceName="jdbc/nutzer" userTable="users" userNameCol="user_name" userCredCol="user_pass" userRoleTable="user_roles" roleNameCol="role_name"/> 5 Versuche 5 Minute Sperre Speicherung von 1000 Vorfällen Ein Löschen vor Ablauf einer Stunde aus dem Attack Cache gibt in der ersten Stunden eine Warnung! <!-- Use the LockOutRealm to prevent attempts to guess user passwords via a brute-force attack --> <Realm className="org.apache.catalina.realm.LockOutRealm"> <!-- This Realm uses the UserDatabase configured in the global JNDI resources under the key "UserDatabase". Any edits that are performed against this UserDatabase are immediately available for use by the Realm. --> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> </Realm> © 2011 Peter Roßbach ([email protected]) Login Brute-Force Attack-Schutz 65 © 2011 Peter Roßbach ([email protected]) Test eines Servlets 66 Tomcat HelloTest package hello; import java.io.IOException; package hello; import import import import import import import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; java.io.File; org.apache.catalina.core.StandardContext; org.apache.catalina.startup.Tomcat; org.apache.catalina.startup.TomcatBaseTest; org.apache.tomcat.util.buf.ByteChunk; org.junit.Test; public class HelloTest extends TomcatBaseTest { @Test public void testHello() throws Exception { Tomcat tomcat = getTomcatInstance(); File appDir = new File("WebContent"); StandardContext ctx = (StandardContext) tomcat.addWebapp(null, "/hello", appDir.getAbsolutePath()); tomcat.addServlet(ctx, "hello", new Hello()); ctx.addServletMapping("/Hello", "hello"); tomcat.start(); @WebServlet("/Hello") public class Hello extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/plain"); response.getWriter().println("Hello World!"); } ByteChunk out = getUrl("http://127.0.0.1:" + getPort() + "/hello/Hello"); assertEquals("Hello World!\n", out.toString()); } } } © 2010 Peter Roßbach ([email protected]) 67 © 2010 Peter Roßbach ([email protected]) 68 Eclipse Ausgabe Status • • 69 © 2010 Peter Roßbach ([email protected]) Tomcat 7.0.6 - Starter Release • • • TCK passed Kleiner Bugs Nun brauchen wir Euch!! Integration in JEE 6 Web Profile in Geronimo • Vermutlich Q1 2011 © 2011 Peter Roßbach ([email protected]) F&Q Hilfe ist nah... • • News ! • http://tomcat.objektpark.org/ Kommen Sie zum meinen Workshop‘s und Sessions • ! JAX Mainz 2011 ! Beratung, Schulung, Workshops und Tomcat Support mailto:[email protected] • © 2011 Peter Roßbach ([email protected]) LinuxHotel.de -- Lernen in angenehmer Atmosphäre mit Experten • • • • • • • • • Peter Roßbach • 70 71 Schulungen für Administratoren und Entwickler Alles im Bereich Linux, Netzwerk und OS Services Groovy & Grails ( Dierk König & Marc Guillemot) Osgi (Gerd Wütherich ) Apache Tomcat (Peter Roßbach) Apache httpd (Michael Wandel & Peter Roßbach) Webcontainer Firewalls (Christian Schneider & Thomas Krautgartner) Java für Architekten (Torsten Friebe) bald mehr... © 2011 Peter Roßbach ([email protected]) 72
Documents pareils
Dublin Core and Linked Data
Dublin Core and Linked Data
Tom Baker, DCMI
Tokyo, 8 December 2010