Repository: camel Updated Branches: refs/heads/master 57758538f -> 3c3c03852
CAMEL-10392: Add overall documentation Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/3c3c0385 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/3c3c0385 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/3c3c0385 Branch: refs/heads/master Commit: 3c3c03852d717ce85d128affa874f39a3731b835 Parents: 5775853 Author: Stephan Siano <stephan.si...@sap.com> Authored: Fri Oct 21 10:07:51 2016 +0200 Committer: Stephan Siano <stephan.si...@sap.com> Committed: Fri Oct 21 10:11:10 2016 +0200 ---------------------------------------------------------------------- docs/user-manual/en/SUMMARY.md | 1 + docs/user-manual/en/http-session.adoc | 139 +++++++++++++++++++++++++++++ 2 files changed, 140 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/3c3c0385/docs/user-manual/en/SUMMARY.md ---------------------------------------------------------------------- diff --git a/docs/user-manual/en/SUMMARY.md b/docs/user-manual/en/SUMMARY.md index 758ab74..0af8dc9 100644 --- a/docs/user-manual/en/SUMMARY.md +++ b/docs/user-manual/en/SUMMARY.md @@ -34,6 +34,7 @@ * [Exchange](exchange.adoc) * [Exchange Pattern](exchange-pattern.adoc) * [Expression](expression.adoc) + * [HTTPSession](http-session.adoc) * [Injector](injector.adoc) * [Intercept](intercept.adoc) * [Inversion Of Control With Smart Defaults](inversion-of-control-with-smart-defaults.adoc) http://git-wip-us.apache.org/repos/asf/camel/blob/3c3c0385/docs/user-manual/en/http-session.adoc ---------------------------------------------------------------------- diff --git a/docs/user-manual/en/http-session.adoc b/docs/user-manual/en/http-session.adoc new file mode 100644 index 0000000..e61e65a --- /dev/null +++ b/docs/user-manual/en/http-session.adoc @@ -0,0 +1,139 @@ +[[HTTPSession-HTTPSession]] +HTTP-Session Handling +~~~~~~~~~~~~~~~~~~~~~ + +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). + +[[HTTPSession-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 of the session scope the implementation must honor the domain of +the handled cookies. + +[[HTTPSession-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. + +[[HTTPSession-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. + +[[HTTPSession-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. + +[[HTTPSession-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 +to 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). + +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"/> +----------------------------------------------------------- + +[[HTTPSession-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: + +. Include a build reference to camel-http-common (if it is not already there) +. Add a cookieHandler parameter to the endpoint class (together with getter and setter) +. 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. +. 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>>`. + +Note: 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. \ No newline at end of file