managed-client-webapp
Directory actions
More options
Directory actions
More options
managed-client-webapp
Folders and files
| Name | Name | Last commit date | ||
|---|---|---|---|---|
parent directory.. | ||||
<!--
~ DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
~
~ Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved.
~
~ The contents of this file are subject to the terms of either the GNU
~ General Public License Version 2 only ("GPL") or the Common Development
~ and Distribution License("CDDL") (collectively, the "License"). You
~ may not use this file except in compliance with the License. You can
~ obtain a copy of the License at
~ http://glassfish.java.net/public/CDDL+GPL_1_1.html
~ or packager/legal/LICENSE.txt. See the License for the specific
~ language governing permissions and limitations under the License.
~
~ When distributing the software, include this License Header Notice in each
~ file and include the License file at packager/legal/LICENSE.txt.
~
~ GPL Classpath Exception:
~ Oracle designates this particular file as subject to the "Classpath"
~ exception as provided by Oracle in the GPL Version 2 section of the License
~ file that accompanied this code.
~
~ Modifications:
~ If applicable, add the following below the License Header, with the fields
~ enclosed by brackets [] replaced by your own identifying information:
~ "Portions Copyright [year] [name of copyright owner]"
~
~ Contributor(s):
~ If you wish your version of this file to be governed by only the CDDL or
~ only the GPL Version 2, indicate your decision by adding "[Contributor]
~ elects to include this software in this distribution under the [CDDL or GPL
~ Version 2] license." If you don't indicate a single choice of license, a
~ recipient has the option to distribute your version of this file under
~ either the CDDL, the GPL Version 2 or to extend the choice of license to
~ its licensees as provided above. However, if you add GPL Version 2 code
~ and therefore, elected the GPL Version 2 license, then the option applies
~ only if the new code is made subject to such option by the copyright
~ holder.
-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Managed Client Example</title>
</head>
<body>
<h1>Managed Client Example</h1>
<p>This example demonstrates a simple usage of Jersey Managed Client feature.</p>
<h2>Contents</h2>
<p>The mapping of the URI path space is presented in the following table:</p>
<table border="1">
<tr>
<th>URI path</th>
<th>Resource class</th>
<th>HTTP methods</th>
<th>Allowed values</th>
</tr>
<tr>
<td>/public/a</td>
<td>PublicResource</td>
<td>GET</td>
<td> </td>
</tr>
<tr>
<td>/public/b</td>
<td>PublicResource</td>
<td>GET</td>
<td> </td>
</tr>
<tr>
<td>/internal/a</td>
<td>InternalResource</td>
<td>GET</td>
<td> </td>
</tr>
<tr>
<td>/internal/b</td>
<td>InternalResource</td>
<td>GET</td>
<td> </td>
</tr>
</table>
<p>
In the example, the requests to a <em>public resource</em> deployed on <code>/public/</code> path are forwarded
to an <em>internal resource</em> (deployed on <code>/internal/</code> path) using injected
<a href="https://jax-rs-spec.java.net/nonav/2.0/apidocs/javax/ws/rs/client/WebTarget.html">javax.ws.rs.client.WebTarget</a>
instances produced using 2 separate managed clients each of the managed clients using it's own custom configuration.
</p>
<p>
An access to internal resource methods is guarded by a container request filter (<code>CustomHeaderFilter</code>)
which rejects any request that does not contain expected custom header set to an expected value. In the example,
the 2 managed clients (used by a public resource to access the methods on the internal resource) are configured
with custom configurations, each containing a registration of a custom client request filter that is instructed
to append a required custom header and value to every outgoing request. Only with managed client support working
properly, the public resource is able to successfully retrieve data from the internal resource.
</p>
<h2>Running the Example</h2>
<p>Run the example as follows:</p>
<blockquote><pre>
mvn clean package jetty:run</pre></blockquote>
<p>
This deploys current example on the local host. You can then access WADL description of the deployed application at
<a href="http://localhost:8080/managed-client-webapp/application.wadl">
http://localhost:8080/managed-client-webapp/application.wadl</a>.
</p>
<p>
You can access public resource of this application using curl:
</p>
<blockquote><code>curl -v -H "Accept: text/plain" http://localhost:8080/managed-client-webapp/public/a</code></blockquote>
<blockquote><code>curl -v -H "Accept: text/plain" http://localhost:8080/managed-client-webapp/public/b</code></blockquote>
<p>
In this example you should see the returned response message body contains "a" or "b" respectively upon successful invocation.
</p>
<p>
You may also verify that access to internal resource is not possible without including a proper header in the request. First
try to access the internal resource without any custom header:
</p>
<blockquote><code>curl -v -H "Accept: text/plain" http://localhost:8080/managed-client-webapp/internal/a</code></blockquote>
<blockquote><code>curl -v -H "Accept: text/plain" http://localhost:8080/managed-client-webapp/internal/b</code></blockquote>
<p>
In both cases a <code>HTTP 403 Forbidden.</code> response is returned. Now lets try to access the resource once again, but
this time we'll include also the expected custom headers:
</p>
<blockquote>
<code>curl -v -H "Accept: text/plain" -H "custom-header:a" http://localhost:8080/managed-client-webapp/internal/a</code>
</blockquote>
<blockquote>
<code>curl -v -H "Accept: text/plain" -H "custom-header:b" http://localhost:8080/managed-client-webapp/internal/b</code>
</blockquote>
<p>
Finally, you should see the invocation succeeded and the returned response message body contains "a" or "b" respectively.
</p>
</body>
</html>