Homer
Homer

Reputation: 59

Adobe AEM, how to get SlingHttpServletRequest object from Apache felix OSGI service

I am working on Adobe AEM 6.0 and still new to Apache Felix and Sling and I would like to know how to get instance of SlingHttpServletRequest from an OSGI service annotated with @Service.

Is it possible to get the request from ResourceResolverFactory or SlingRepository?

@Service
@Component(metatype = false)
public class TestServiceImpl implements  TestService{

    @Reference
    private ResourceResolverFactory resourceResolverFactory;
    @Reference
    private SlingRepository repository;

}

I am aware that SlingHttpServletRequest is readily available for classes extending SlingAllMethodsServlet however as for my requirement I need to write a service rather than a servlet.

The rationale behind why I need SlingHttpServletRequest is because I need to get the client's IP address for audit logging purposes.

Is there any better way to do this? Or at least someone can help point me to correct direction how I can achieve such requirement.

Upvotes: 2

Views: 6657

Answers (1)

Olha Mantuliak
Olha Mantuliak

Reputation: 93

I think the Filter is what you need. Create a service that implements Filter. The doFilter method is to be called on every Sling request (if sling.filter.scope=REQUEST of course).
See also Sling Filter

package com.examples.test.filter;

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 org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.SlingHttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component(
    metatype = true,
    label = "Test Filter",
    immediate = true,
    enabled = true
)
@Service
@Properties({
    @Property(name = "sling.filter.scope", value = "REQUEST", propertyPrivate = true),
    @Property(name = "service.ranking", intValue = 100, propertyPrivate = true)
})
public class TestFilter implements Filter {

    private final Logger log = LoggerFactory.getLogger(getClass());

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        //If you'll need some SlingHttpServletRequest functionality
        //SlingHttpServletRequest httpRequest = (SlingHttpServletRequest) request;

        log.info(request.getRemoteAddr());

        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig config) throws ServletException {
        // TODO Auto-generated method stub
    }

}

Upvotes: 1

Related Questions