2014-12-14 3 views
2

Adobe AEM 6.0에서 작업 중이며 Apache Felix와 Sling에 익숙하며 OSGI 서비스에서 SlingHttpServletRequest의 인스턴스를 가져 오는 방법을 알고 싶습니다. @ 서비스.Adobe AEM, Apache felix OSGI 서비스에서 SlingHttpServletRequest 객체를 얻는 방법

ResourceResolverFactory 또는 SlingRepository에서 요청을받을 수 있습니까?

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

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

} 

나는 SlingHttpServletRequest 내가 서블릿이 아닌 서비스를 작성해야하지만 내 요구 사항에 대한로 SlingAllMethodsServlet을 확장 클래스 쉽게 사용할 수 있음을 알고 있습니다.

SlingHttpServletRequest가 필요한 이유의 근거는 감사 로깅을 위해 클라이언트의 IP 주소를 가져와야하기 때문입니다.

더 좋은 방법이 있습니까? 또는 적어도 누군가가 그러한 요구 사항을 달성 할 수있는 방향을 수정하도록 나를 도울 수 있습니다.

+0

를 참조하십시오. 이를 얻는 유일한 방법은 SlingServlet 또는 JSP (실제로 서블릿이기도 함)입니다. 내가 이해할 수없는 것은 서비스에 클라이언트 IP가 필요한 이유입니다. 어떻게 서비스 메소드가 트리거되는지, 어쩌면 요청을 메소드 매개 변수로 전달할 수 있습니다. – Thomas

+0

슬링의 서블릿은 실제로 OSGi 서비스입니다. – Markus

+0

Thomas 감사합니다. 로깅 목적을 감사하기 위해 요청 개체에서 IP 주소를 추출해야합니다. 객체를 인수로 전달하면 서비스를 호출 할 때 마지막 선택입니다. 어떤 방법으로 번들 컨텍스트에서 가져 오거나 삽입 된 객체 참조에서 가져와야한다고 기대하고있었습니다. – Homer

답변

1

나는 Filter이 필요한 것이라고 생각합니다. Filter을 구현하는 서비스를 만듭니다. doFilter 메서드는 모든 슬링 요청에서 호출해야합니다 (sling.filter.scope = REQUEST). 이름 SlingHttpServletReques`는 요청입니다 알 수 있듯이
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 
    } 

} 
관련 문제