This is an automated email from the ASF dual-hosted git repository. acosentino pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
commit 35a23cff2baf27083ee4ac24f98861f25583437d Author: Andrea Cosentino <anco...@gmail.com> AuthorDate: Wed Oct 31 10:37:42 2018 +0100 Added Http Session Handling docs --- docs/user-manual/en/http-session-handling.adoc | 152 +++++++++++++++++++++++++ 1 file changed, 152 insertions(+) diff --git a/docs/user-manual/en/http-session-handling.adoc b/docs/user-manual/en/http-session-handling.adoc new file mode 100644 index 0000000..e0c3ebb --- /dev/null +++ b/docs/user-manual/en/http-session-handling.adoc @@ -0,0 +1,152 @@ +[[HTTP-SessionHandling-SessionScope]] +=== HTTP Session Handling + +*Available as of Camel 2.19* + +Several Camel components can use HTTP as the underlying transport +protocol. In general HTTP calls are stateless in nature, however some +servers allow to maintain state via cookies. Cookies are often used to +maintain a server session (e.g. via a session cookie called "JSESSIONID" +with servers implementing the JEE Servlet specification). + +[[HTTP-SessionHandling-SessionScope]] +==== Session Scope + +If a Camel route intends to implement some kind of HTTP session handling +the scope of this session should be considered. + +Independently from the session scope the implementation must honor the +domain of the handled cookies. + +[[HTTP-SessionHandling-Route/ContextScope]] +==== Route/Context Scope + +It might be desirable to have a single session for a route or a +link:camelcontext.html[CamelContext]. This essentially means that all +calls to a server issued from a route or CamelContext share a single +HTTP session. + +[[HTTP-SessionHandling-EndpointScope]] +==== Endpoint Scope + +It is also possible to have a session on an link:endpoint.html[Endpoint] +entity. This would mean that all invocations of an HTTP call issued by a +single Endpoint share a session, whereas different Endpoints never share +sessions, even if the call is sent to the same server. +Some components like camel-http, and camel-http4 support endpoint scoped +sessions even prior to version 2.19. + +[[HTTP-SessionHandling-ExchangeScope]] +==== Exchange Scope + +The third option to define a session scope is on +link:exchange.html[Exchange]level. This is particularly useful for +scenarios where the server session is really maintaining state. + +In this case the route could e.g. first do a login call, then some +update calls and finally a logout call. If the session handling would be +defined on route or CamelContext scopes this would seem to run, however +under load parallel invocations of the route would share a *single* +session, which could cause issues. If the session is defined on exchange +scope, each invocation of the route will get a separate session and the +server can maintain a separate state for the different parallel +invocations. + +[[HTTP-SessionHandling-Usage]] +==== Usage + +If you are a Camel user, you see that several Camel components support +the cookieHandler parameter on endpoint level. All you need to do is to +instantiate a cookie handler appropriate for your use case and +reference it in the cookieHandler parameter for all endpoints that are +supposed to participate in the HTTP session. + +There are two pre-implemented cookie handlers: +`org.apache.camel.http.common.cookie.InstanceCookieHandler` and +`org.apache.camel.http.common.cookie.ExchangeCookieHandler.` + +The `InstanceCookieHandler` stores cookies in an instance of itself. +You can compare that with a browser instance that is shared between all +the endpoints that use it (and will be used for all invocations of these +endpoints). If you want to maintain separate sessions for different +endpoints or groups of endpoints you may have multiple instances of the +`InstanceCookieHandler`. + +The `ExchangeCookieHandler` stores the session in the exchange. With the +browser analogy this means that each Exchange will get its own browser +instance (so sessions are separated). As the `ExchangeCookieHandler` +does not store any state it is generally not useful to have multiple +`ExchangeCookieHandler` instances (as they would access the same data, +anyway). + +[[HTTP-SessionHandling-Example]] +==== Example + +The following three routes will each do two invocations of an echo REST +service. In the first route (without a cookie handler) each invocation +will get a new session. For the second route all invocations will share +a session. For the third route the first and the second invocation +within the route share a session, but different (even parallel) +invocations of the route will not share a session. + +[source,xml] +-------------------------------------------------------------------------------------------------------- + <cxf:rsClient id="rsClientProxy" address="http://127.0.0.1:8080/CxfRsProducerSessionTest/" + serviceClass="org.apache.camel.component.cxf.jaxrs.testbean.EchoService" + loggingFeatureEnabled="true" /> + + <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> + <route> + <from uri="direct://proxy"/> + <to uri="cxfrs://bean://rsClientProxy"/> + <convertBodyTo type="java.lang.String"/> + <to uri="cxfrs://bean://rsClientProxy"/> + </route> + <route> + <from uri="direct://proxyinstance"/> + <to uri="cxfrs://bean://rsClientProxy?cookieHandler=#instanceCookieHandler"/> + <convertBodyTo type="java.lang.String"/> + <to uri="cxfrs://bean://rsClientProxy?cookieHandler=#instanceCookieHandler"/> + </route> + <route> + <from uri="direct://proxyexchange"/> + <to uri="cxfrs://bean://rsClientProxy?cookieHandler=#exchangeCookieHandler"/> + <convertBodyTo type="java.lang.String"/> + <to uri="cxfrs://bean://rsClientProxy?cookieHandler=#exchangeCookieHandler"/> + </route> + </camelContext> + + <bean id="instanceCookieHandler" class="org.apache.camel.http.common.cookie.InstanceCookieHandler"/> + <bean id="exchangeCookieHandler" class="org.apache.camel.http.common.cookie.ExchangeCookieHandler"/> +-------------------------------------------------------------------------------------------------------- + +[[HTTP-SessionHandling-ComponentDevelopers]] +==== Component Developers + +If you want to develop a HTTP based component that is supposed to +participate in a session you have to add the following parts to your +code: + +1. Include a build reference to camel-http-common (if it is not already +there) +2. Add a cookieHandler parameter to the endpoint class (together with +getter and setter) +3. Before your code does the HTTP call, if a cookie handler is set on +the endpoint perform a `cookieHandler.loadCookies(exchange, uri)` call. +It will return a `Map<String, List<String>>` containing the headers that +need to be sent to the server. The details how you need to send these +headers to the server depend on the underlying HTTP API you are using. +4. After your code does receive the HTTP response if a cookie handler +is set on the endpoint perform a +`cookieHandler.storeCookies(exchange, uri, m)` call. `m` is a +`Map<String, List<String>>` containing the HTTP headers returned from +the server. + +[[HTTP-SessionHandling-MoreInfo]] +==== More Info + +Some APIs provide more direct support for cookie handling. In this case +it might be easier to get the underlying `java.net.CookieStore` with a +`cookeManager.getCookieStore(exchange)` call and handle the cookies +using the cookie interface provided by the underlying library. +