Expand my Community achievements bar.

Don’t miss the AEM Skill Exchange in SF on Nov 14—hear from industry leaders, learn best practices, and enhance your AEM strategy with practical tips.
SOLVED

Sling Filter - Access an asset URL with the RequestDispatcher

Avatar

Level 2

Hello!

I am working in a feature about Sling Filters in AEM. I have to intercept a specific URL in AEM, e.g /en-us/abc/folder1 and without modify that URL, forward an asset URL from the DAM folder. The asset exist in the DAM folder at this location: /content/dam/myApp/test.pdf.  So here is an approach of this implementation:

 

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if (!(request instanceof SlingHttpServletRequest) || !(response instanceof SlingHttpServletResponse)) { // Not a SlingHttpServletRequest/Response, so ignore. chain.doFilter(request, response); // This line would let you // proceed to the rest of the // filters. return; } final SlingHttpServletRequest slingRequest = (SlingHttpServletRequest) request; final SlingHttpServletResponse slingResponse = (SlingHttpServletResponse) response; String tempURI = ""; //some impl here if (matchFound) { tempURI = "/content/dam/app/test.pdf"; RequestDispatcher dispatch = slingRequest.getRequestDispatcher(tempURI); dispatch.forward(slingRequest, slingResponse); return; } chain.doFilter(request, response); }

But the problem is that I get an empty or blank pdf so the asset is not loaded correctly.  I tried instead of forwarding an DAM asset go to a URL page and is working good in that case.  So, I wonder if the forward method only works for pages (contentType="text/html") and how can I do this by retrieving the asset with that filter ?

Any help will be appreciated!

Thanks

1 Accepted Solution

Avatar

Correct answer by
Level 10

I checked with some internal Adobe ppl - this was their response: 

There is some DAM Asset filter that prevents Forwards from occurring. You *might* be able to bump that up to a Felix Servlet Filter and do something up there (might need to wrap the Request and change the URI, not sure)

Check the ACS AEM Samples page for a Felix Servlet Filter if you want to try it out.

ACS AEM Samples -- http://adobe-consulting-services.github.io/acs-aem-samples/

View solution in original post

5 Replies

Avatar

Level 10

We will look at getting an example of this on mon. 

Avatar

Level 2

smacdonald2008 wrote...

We will look at getting an example of this on mon. 

 

Hello, have you found something about this ?

Thanks and regards!

Avatar

Level 2

Hello, I tried another scenario to get an idea about the issue that I am facing.  And when I do a forward to a image or text URL e.g:  en-us/folder1/folder2/test.jpg . I get an "You don't have permission to access to this page. Please contact the Administrator" message, so I wonder if maybe there is something else that is executing before my custom filter. I tried putting a breakpoint and debugging but after the call to 

dispatch.forward(slingRequest, slingResponse);

I get always the same error.

Avatar

Correct answer by
Level 10

I checked with some internal Adobe ppl - this was their response: 

There is some DAM Asset filter that prevents Forwards from occurring. You *might* be able to bump that up to a Felix Servlet Filter and do something up there (might need to wrap the Request and change the URI, not sure)

Check the ACS AEM Samples page for a Felix Servlet Filter if you want to try it out.

ACS AEM Samples -- http://adobe-consulting-services.github.io/acs-aem-samples/

Avatar

Level 4

Can you try with order = -700, // The smaller the number, the earlier in the Filter chain (can go negative);

Its worked for me.

@SlingFilter(generateComponent = true, generateService = true, order = -700, scope = SlingFilterScope.REQUEST)
public class SampleFilter implements Filter {

    private Logger logger = LoggerFactory.getLogger(SampleFilter.class);

    public void init(FilterConfig filterConfig) throws ServletException {
    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        if (!(request instanceof SlingHttpServletRequest)
                || !(response instanceof SlingHttpServletResponse)) {
            // Not a SlingHttpServletRequest/Response, so ignore.
            chain.doFilter(request, response); // This line would let you
                                                // proceed to the rest of the
                                                // filters.
            return;
        }

        final SlingHttpServletRequest slingRequest = (SlingHttpServletRequest) request;
        final SlingHttpServletResponse slingResponse = (SlingHttpServletResponse) response;
        String tempURI = "";
        // some impl here

        logger.info("Inside sample filter {}", slingRequest
                .getRequestPathInfo().getResourcePath());

        boolean matchFound = false;

        if (slingRequest.getRequestPathInfo().getResourcePath()
                .contains("/en-us/abc/folder1")) {

            matchFound = true;
        }

        if (matchFound) {

            tempURI = "/content/dam/geometrixx/documents/GeoPyramid_Datasheet.pdf";

            RequestDispatcher dispatch = slingRequest
                    .getRequestDispatcher(tempURI);
            dispatch.forward(slingRequest, slingResponse);
            return;
        }

        chain.doFilter(request, response);
    }

    public void destroy() {
    }

}

 

Thanks

Prem