Expand my Community achievements bar.

Enhance your AEM Assets & Boost Your Development: [AEM Gems | June 19, 2024] Improving the Developer Experience with New APIs and Events

Unlock the Secrets of Filters in AEM: Boost Performance, Enhance Security and Implement Custom Logic | AEM Community Blog Seeding




Unlock the Secrets of Filters in AEM: Boost Performance, Enhance Security and Implement Custom Logic by Monendra singh


Filters in Adobe Experience Manager (AEM) are a powerful feature that allows developers to intercept and manipulate requests before they are handled by the AEM application. They can be used to perform tasks such as caching, compression, authentication, and more. Filters in AEM are implemented as a chain of OSGi services, which are executed in a specific order. Developers can create custom filters by implementing the javax.servlet.Filter interface and configuring them through the OSGi framework. In addition, AEM provides a set of built-in filters for common tasks, such as the CacheFilter for caching responses, the GZipFilter for compressing responses, and the SlingAuthenticator for handling authentication. Filters in AEM are powerful tools that can be used to improve the performance of an AEM application and enhance the user experience.

In AEM, there are several types of filters that can be used, including:

Sling Filters: These filters are executed by the Sling Servlet and are used to modify the request and response, such as for authentication, caching, or logging. For example, a Sling filter can be used to add a header to the response or to check if the user is logged in before allowing them to access a specific resource. Sling filters are configured in the Sling Filter Manager, which allows you to apply them to specific paths or servlets.
Use case: A Sling filter can be used to cache the response of a certain path to improve the performance of the website.

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.osgi.framework.Constants;
import org.osgi.service.component.annotations.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component(service = Filter.class, property = {
Constants.SERVICE_DESCRIPTION + "=Cache Filter",
public class CacheFilter implements Filter {
private static final Logger log = LoggerFactory.getLogger(CacheFilter.class);
private static final int CACHE_TIME = 3600; // one hour

public void init(FilterConfig filterConfig) throws ServletException {

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.setHeader("Cache-Control", "public, max-age=" + CACHE_TIME);
httpResponse.setDateHeader("Expires", System.currentTimeMillis() + CACHE_TIME * 1000);
chain.doFilter(request, response);

public void destroy() {

Read Full Blog

Unlock the Secrets of Filters in AEM: Boost Performance, Enhance Security and Implement Custom Logic


Please use this thread to ask the related questions.

Kautuk Sahni
0 Replies