Expand my Community achievements bar.

Adobe Summit 2025: AEM Session Recordings Are Live! Missed a session or want to revisit your favorites? Watch the latest recordings now.

Mark Solution

This conversation has been locked due to inactivity. Please create a new post.

AEM filter fails to redirect when using "download" attribute in <a> tag

Avatar

Level 1

Problem to solve :  to implement gated content on documents or (assets) tagged with a specific tag,if a tag is used and a self generated cookie in not present i have to redirect the user to a form to complete and on the successful submission of the form a cookie will be created. then the user can download the asset

Ref: How to achieve gated content

html download element :

  <a href="https://forums.adobe.com/content/dam/test.pdf" target="_self" download="doc">

</a>

Filter Implementation :

@SlingFilter(order = -700, scope = SlingFilterScope.REQUEST)

public class GatedContentFilter implements Filter {

   private final Logger logger = LoggerFactory.getLogger(getClass());
  private final String TAGSELECTOR = "cq:tags";
  private final String FORMPAGE = "/content/form.html";
  private final String TAGNAME = "derby";

  private final String COOKIE = "TEST"; // eg : cookie name

   @Override

   public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain filterChain) throws IOException, ServletException {

   final SlingHttpServletRequest slingRequest = (SlingHttpServletRequest) request;
  final SlingHttpServletResponse slingResponse = (SlingHttpServletResponse) response;

   String path = slingRequest.getRequestPathInfo().getResourcePath();
  if(!path.isEmpty() && path !=null){

  Resource resource = slingRequest.getResourceResolver().getResource(path);
  if(resource != null){

  Asset asset = resource.adaptTo(Asset.class);
  if(asset != null){

  String assetTags = asset.getMetadataValue(TAGSELECTOR);
  if(assetTags != null){

  String[] assetTagsArray = assetTags.split(",");
  if(assetTagsArray.length > 0){

   for(String tag : assetTagsArray){

   if(tag.toLowerCase().contains(TAGNAME)  ) { //and cookie is not present

  slingResponse.sendRedirect(FORMPAGE);
  return;
   }

  }

  }else{

  logger.info("No tags associated with the asset at: " + path);
   }

  }

  }

  }

  }

  filterChain.doFilter(request, response);
   }

  @Override

   public void init(FilterConfig filterConfig) {

  }

  @Override

   public void destroy() {

  }

}

if this is implemented without the download attribute works fine but i need to have the download attribute.

Thanks.

1 Reply

Avatar

Community Advisor

HI,

the HTML spec's download attribute to a elements. When used, this attribute signifies that the resource it points to should be downloaded by the browser rather than navigating to it. That means response header contain content-type as download that's why the filter is not working.

You can remove the download attribute and check the url and if valid send response as download.

Arun Patidar

AEM LinksLinkedIn