In RESTful apps, it is often useful to create hard to guess URLs, as a simple privacy device.
Here’s a self-explaining example (with hardcoded parameters) of how to do that in Sling.
After installing this component, an HTTP POST to a node named ‘foo’ creates a child node with a somewhat long hex string as its name, instead of the usual simple names generated by Sling.
package foo;
import java.util.Random;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.servlets.post.NodeNameGenerator;
/** Example that generates hard-to-guess node names in Sling,
* for nodes added under nodes named 'foo'
*
* To test, build and install a bundle that includes this component,
* and run
* <pre>
* curl -X MKCOL http://admin:admin@localhost:4502/foo
* curl -F title=bar http://admin:admin@localhost:4502/foo/
* </pre>
* The output of the second curl call should return something like
* <pre>
* Content created /foo/dd712dd234637bb9a9a3b3a10221eb1f
* </pre>
* Which is the path of the created node.
*/
@Component
@Service
public class FooNodeNameGenerator implements NodeNameGenerator {
private static final Random random = new Random(System.currentTimeMillis());
/** @inheritDoc */
public String getNodeName(
SlingHttpServletRequest request,
String parentPath,
boolean requirePrefix,
NodeNameGenerator defaultNng)
{
if(parentPath.endsWith("/foo")) {
final StringBuilder name = new StringBuilder();
for(int i=0; i < 2; i++) {
name.append(Long.toHexString(random.nextLong()));
}
return name.toString();
}
return null;
}
}
Posted by bdelacretaz
Yesterday night’s BOF was a good opportunity to make more people aware of the nice things in 