Skip to content

Latest commit

 

History

History
 
 

Folders and files

NameName
Last commit message
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>&nbsp;</td>
    </tr>
    <tr>
        <td>/public/b</td>
        <td>PublicResource</td>
        <td>GET</td>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td>/internal/a</td>
        <td>InternalResource</td>
        <td>GET</td>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td>/internal/b</td>
        <td>InternalResource</td>
        <td>GET</td>
        <td>&nbsp;</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 compile exec:java</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/managedclient/application.wadl">http://localhost:8080/managedclient/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/managedclient/public/a</code></blockquote>
<blockquote><code>curl -v -H "Accept: text/plain" http://localhost:8080/managedclient/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/managedclient/internal/a</code></blockquote>
<blockquote><code>curl -v -H "Accept: text/plain" http://localhost:8080/managedclient/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/managedclient/internal/a</code></blockquote>
<blockquote>
    <code>curl -v -H "Accept: text/plain" -H "custom-header:b" http://localhost:8080/managedclient/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>