Generating hard to guess content URLs in Sling
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 *
* curl -X MKCOL http://admin:admin@localhost:4502/foo * curl -F title=bar http://admin:admin@localhost:4502/foo/ ** The output of the second curl call should return something like *
* Content created /foo/dd712dd234637bb9a9a3b3a10221eb1f ** 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;
}
}