Dear All,
Can you please help me to understand the intercept concept in AEM (Do we have any Adobe help document??)
One of the my project requirement is intercepting the all page request under the path http://localhost:4502/editor.html/content/we-retail/104139ToshibaAmericaInc401SavingsPlanFeatures/03...
http://localhost:4502/sites.html/content/we-retail/104139ToshibaAmericaInc401SavingsPlanFeatures
For example I have below 2 pages under the above path.
Can anybody please help me on this ?
What do you mean with "intercept"? You can register a request filter (standard servlet API) and then filter according to all your requirements.
Or are you looking for something different?
Jörg
Views
Replies
Total Likes
Dear Joerg,
Thanks for your help.
Actually My requirement is below.
Intercept HTTP request from thirdparty (endpoint is abc-services/jax-rs/participant-service/secure/participant/search) to AEM
Views
Replies
Total Likes
If it's a HTTP request coming into AEM, you can also use a servlet filter. Then you have the raw request object, but not a structured object (for the payload of this request) yet.
When you mention that path, is it the thirdparty system or a path living in AEM (and using JAX-RS in AEM)?
Jörg
Views
Replies
Total Likes
Hi Joerg,
Thanks a lot for your help and appreciated.
Currently the path is living in AEM and now I have written the below logic for my below requirement using sling filter.
Now my requirement is that when somebody will hit the PlanA (/content/trainingproject/Plan/PlanA) then it will redirect to SunitaFirst.html ( http://localhost:4502/content/trainingproject/Plan/PlanA/Location1/SunitaFirst.html ).
I have written the below code for this. But when I am trying to redirect then I am getting below error.
@SlingFilter(label = "Sample Filter", description = "Sample Description", metatype = true, generateComponent = true, // True if you want to leverage activate/deactivate
generateService = true, order = 0, // The smaller the number, the earlier in the Filter chain (can go negative);
scope = SlingFilterScope.REQUEST) // REQUEST, INCLUDE, FORWARD, ERROR, COMPONENT (REQUEST, INCLUDE, COMPONENT)
public class CustomRedirectFilter implements Filter {
Logger log = LoggerFactory.getLogger(this.getClass());
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// Usually, do nothing
}
@Override
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 SlingHttpServletResponse slingResponse = (SlingHttpServletResponse) response;
final SlingHttpServletRequest slingRequest = (SlingHttpServletRequest) request;
final Resource resource = slingRequest.getResource();
log.info("resource is ----------- ====**** " + resource);
//String rootContentPath="/content/trainingproject/Plan/PlanA";
if (resource.getPath().startsWith("/content/trainingproject/Plan/PlanA")) {
// Is the SlingFilterScope is REQUEST, redirects can be issued.
// Write your custom code here.
slingResponse.sendRedirect("/Location1/SunitaFirst.html");
return;
}
// to proceed with the rest of the Filter chain
chain.doFilter(request, response);
}
@Override
public void destroy() {
// Usually, do Nothing
}
}
ERROR IS BELOW
Views
Replies
Total Likes
You are hitting a non-existing resource (the resource "/Location1/SunitaFirst" does not exist). But if you have requested "/content/trainingproject/Plan/PlanA" and got redirected here, your filter is working.
Views
Replies
Total Likes
Hi Joerg,
thanks for your help. Sorry for late reply. Now redirect is working fine.
But now , When I am running my page with the selectors , it is working fine , as shown below.
When I am not giving selectors then my page is not working fine , as shown below.
My code is below. Am I missing something "or" this is the expected behavior that in author it will not work and in publisher it will work.
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.sling.SlingFilter;
import org.apache.felix.scr.annotations.sling.SlingFilterScope;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.day.cq.wcm.api.Page;
import com.day.cq.wcm.api.PageManager;
// http://localhost:4502/system/console/status-slingfilter
// http://localhost:4502/content/workplace/vignettemigrationcontent/plan/plan-104105/location-9999/Firs...
// http://localhost:4502/content/workplace/vignettemigrationcontent/plan/plan-104139/location-0101/Seco...
@SlingFilter(order = -701, scope = SlingFilterScope.REQUEST)
public class PlanLocationURLParamsFilter implements Filter {
Logger log = LoggerFactory.getLogger(this.getClass());
String planIDinJCR1 = "104105";
String locationIDinJCR1 = "9999";
String planIDinJCR2 = "104139";
String locationIDinJCR2 = "0101";
String[] arrSplit;
int i;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// Usually, do nothing
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
if (!(request instanceof SlingHttpServletRequest) || !(response instanceof SlingHttpServletResponse)) {
// Proceed with the rest of the Filter chain
chain.doFilter(request, response);
return;
}
final SlingHttpServletResponse slingResponse = (SlingHttpServletResponse) response;
final SlingHttpServletRequest slingRequest = (SlingHttpServletRequest) request;
log.info("request for {}, with selector {}", slingRequest.getRequestPathInfo().getResourcePath(),
slingRequest.getRequestPathInfo().getSelectorString());
String multiselector = slingRequest.getRequestPathInfo().getSelectorString();
log.info("MULTISELECTOR is ----------- ====**** " + multiselector);
final Resource resource = slingRequest.getResource();
log.info("resource is ----------- ====**** " + resource);
if (resource.getPath().startsWith("/content/workplace/vignettemigrationcontent/plan")) {
PageManager pageManager = resource.getResourceResolver().adaptTo(PageManager.class);
Page page = pageManager.getPage(resource.getPath());
String templatePath = page.getContentResource().getValueMap().get("cq:template").toString();
if (templatePath.equals("/apps/workplace-fdi/templates/migrationtemplateHTL")) {
arrSplit = multiselector.split(" ");
for (i = 0; i < arrSplit.length; i++) {
log.info("multiselector INSIDE FOR STATEMENT is ====**** " + arrSplit[i]);
}
slingResponse.setHeader("Content-Type", "text/html");
if (multiselector.contains(planIDinJCR1)) {
// log.info("multiselector is ----------- ====**** " + planIDinJCR1 );
slingResponse.getWriter().println("<h1>PlanID is " + planIDinJCR1 + "</h1>");
}
if (multiselector.contains(planIDinJCR2)) {
slingResponse.getWriter().println("<h1>PlanID is " + planIDinJCR2 + "</h1>");
}
if (multiselector.contains(locationIDinJCR1)) {
slingResponse.getWriter().println("<h1>LocationID is " + locationIDinJCR1 + "</h1>");
}
if (multiselector.contains(locationIDinJCR2)) {
slingResponse.getWriter().println("<h1>LocationID is " + locationIDinJCR2 + "</h1>");
}
return;
}
}
chain.doFilter(request, response);
}
@Override
public void destroy() {
// Usually, do Nothing
}
}
Please suggest.
Views
Replies
Total Likes
You have a NullPointer in your code. Unfortunately the screenshot does not indicate the exact line, and also your code misses the line numbers. But it should not be to hard to spot.
Jörg
Views
Replies
Total Likes
Hi jorg,
I have put my contents and code in the my github branch.
GitHub - sunita197881/sunitaworkplace at Intercept-AEM-page
Getting null pointer exception for the below line
String templatePath = page.getContentResource().getValueMap().get("cq:template").toString();
But I am not able to figure out why it is coming null pointer.
Views
Replies
Total Likes
The easiest way, please debug the code by breaking into multiple statements and check if the value exist in valuemap or not.
Resource contentRes = page.getContentResource();
ValueMap map = contentRes.getValueMap();
String templatePath = map.get("cq:template").toString();
Put the null check and add debug statements or simply debug the code while hitting the servlet and check values. You'll get to know why null pointer!
Views
Like
Replies
Views
Likes
Replies