I finally was able to place my filter where I wanted it. I could not figure it 
out
in the Sling source but the bundle provided my the necessary info.

This is the Filter Service configuration to make it appear right after the SSL 
Filter:

@Component( immediate = true, label="Parameter Issue Filter", 
description="Filters Requests to demonstrate the Parameter Issue in Sling", 
metatype=false )
@Service
@Properties(
    {
        @Property(name = "osgi.http.whiteboard.filter.pattern", value="/"),
        @Property(name = "osgi.http.whiteboard.context.select", 
value="(osgi.http.whiteboard.context.name=*)"),
        @Property(name = Constants.SERVICE_DESCRIPTION, value = "Filters 
Requests to demonstrate the Parameter Issue in Sling"),
        @Property(name = Constants.SERVICE_VENDOR, value = "Madplanet.com")
    }
)

With that I am setting the missing parameters which appear in an attribute of
type SlingBindings.

- Andy

> On Feb 20, 2017, at 1:45 PM, Andreas Schaefer Sr. <schaef...@me.com> wrote:
> 
> Hi Julian
> 
> Thanks for the help.
> 
> I tried to figure out how the I18NFilter is registered in Sling but it eludes 
> me.
> Any hint would be appreciated.
> 
> Cheers - Andy
> 
>> On Feb 20, 2017, at 1:47 AM, Julian Sedding <jsedd...@gmail.com 
>> <mailto:jsedd...@gmail.com>> wrote:
>> 
>> Hi Andy
>> 
>> You can register a javax.servlet.Filter with Sling OR with the Felix
>> Whiteboard. If you want to run before the SlingMainServlet, you have
>> to register your filter in the Felix whiteboard (which is what the
>> I18NFilter does). Note that you will not have access to
>> SlingHttpServletRequest objects in that case.
>> 
>> The documentation for the Felix Whiteboard describes properties to
>> select a specific HTTP context[0] by adding some properties. Maybe
>> that helps you to get your code working.
>> 
>> Regards
>> Julian
>> 
>> [0] 
>> https://felix.apache.org/documentation/subprojects/apache-felix-http-service.html#filter-service-properties
>>  
>> <https://felix.apache.org/documentation/subprojects/apache-felix-http-service.html#filter-service-properties>
>> 
>> 
>> On Sat, Feb 18, 2017 at 1:59 AM, Andreas Schaefer Sr. <schaef...@me.com 
>> <mailto:schaef...@me.com>> wrote:
>>> Hi
>>> 
>>> I tried to create a Filter to showcase the issue but I do fail with the 
>>> latest
>>> code base.
>>> 
>>> The reason is that I cannot add a filter ahead of the Sling Main Servlet 
>>> even
>>> though there is the I18N and SSL Filter that are running ahead of it.
>>> For a customer I use that in order to adjust the query string and the 
>>> parameters
>>> and of late also the session timeout (bug in felix).
>>> 
>>> Funny thing is that my filter is called when I access the OSGi Console then
>>> the filter is called just not when I work with a sling page (slingshot).
>>> 
>>> Question: is is still possible to add a filter ahead of Sling Main Servlet 
>>> and if
>>> so what are the configuration. This is what I tried:
>>> 
>>> 1) Does only work if sling some is enabled but then I am not ahead of the 
>>> Sling Main Servlet
>>> 
>>> //@Component( immediate = true, label="Parameter Issue Filter", 
>>> description="Filters Requests to demonstrate the Parameter Issue in Sling", 
>>> metatype=false )
>>> //@Service
>>> //@Properties(
>>> //    {
>>> //        @Property( name="service.description", value="Parameter Issue 
>>> Filter" ),
>>> //        @Property( name="service.vendor", value="Adobe" ),
>>> ////        @Property(name="sling.filter.scope", value="request")
>>> //        @Property( name="pattern", value="/", propertyPrivate=true )
>>> //    }
>>> //)
>>> 
>>> 2) Taken from the SslFilter but I am not ahead of the Sling Main Servlet
>>> 
>>> //@SlingFilter(generateService = true, label = "Parameter Issue Filter",
>>> //    order = 500, scope = { SlingFilterScope.REQUEST, 
>>> SlingFilterScope.ERROR })
>>> //@Properties({
>>> //    @Property(name = "pattern", value="/.*"),
>>> //    @Property(name = Constants.SERVICE_DESCRIPTION, value = "Filters 
>>> Requests to demonstrate the Parameter Issue in Sling"),
>>> //    @Property(name = Constants.SERVICE_VENDOR, value = "Madplanet.com 
>>> <http://madplanet.com/>") })
>>> 
>>> 2) Taken from the I18NFilter but this one is not called for Sling page
>>> 
>>> @Component(immediate = true, policy = ConfigurationPolicy.IGNORE, label = 
>>> "Parameter Issue Filter")
>>> @Service(value = Filter.class)
>>> @Properties({
>>>    @Property(name = "pattern", value = "/.*"),
>>>    @Property(name = Constants.SERVICE_RANKING, intValue = 0x8100),
>>>    @Property(name = "service.description", value = "Filters Requests to 
>>> demonstrate the Parameter Issue in Sling"),
>>>    @Property(name = "service.vendor", value = "Madplanet.com 
>>> <http://madplanet.com/>")
>>> })
>>> 
>>> I traced it down to the Per Context Handler Registry but I am unable to 
>>> register
>>> my Filter with the one responsible for Sling pages.
>>> 
>>> Any help would be greatly appreciated.
>>> 
>>> This is 3rd client where I had to use a Filter ahead of the Sling Resource 
>>> Resolution
>>> do make changes to the request before the resource is resolved.
>>> 
>>> 
>>> If that is not possible is there a way to make changes to the sling resource
>>> in a filter like when I rewrite the URL to manage (AEM) dispatcher cache
>>> for stuff like CSS or images?
>>> 
>>> Thanks - Andy Schaefer
>>> 
>>>> On Feb 16, 2017, at 4:05 AM, Robert Munteanu <romb...@apache.org 
>>>> <mailto:romb...@apache.org>> wrote:
>>>> 
>>>> Hi Andy,
>>>> 
>>>> On Tue, 2017-02-14 at 14:05 -0800, Andreas Schaefer Sr. wrote:
>>>>> While working on AEM 6.2 SP1 with a Servlet Filter
>>>>> I came across issues with the Parameter Support
>>>>> as they interfere with the Servlet Filters or at least
>>>>> with Servlet Filters that are handled before entering
>>>>> the “Sling domain”.
>>>>> 
>>>>> 1) Because of the SlingHttpContext.handleSecurity()
>>>>> the Parameter Support is created as one of the first
>>>>> Servlet Filters.
>>>>> 2) That Parameter Support reads the parameters from the
>>>>> Servlet Input stream
>>>>> 
>>>>> 3) The Parameter Support Request Wrapper is ditched later
>>>>> 
>>>>> 4) Any later filter will not have access to the parameters
>>>>> from the request
>>>>> 
>>>>> 5) Any Filter that wraps the Servlet Request to change
>>>>> either the Query String or Parameter(s) will do that in vein
>>>>> as the stored Parameter Support in 1) will provide the
>>>>> parameters for anything in Sling
>>>>> 
>>>>> In my current project I am storing the Query String
>>>>> which can be quite long in a Session and re-hydrate
>>>>> that in a Filter. This worked in AEM 6.0 but now fails
>>>>> due to the issues from above.
>>>>> 
>>>>> I don’t mind the Parameter Support but it should
>>>>> check in the getInstance() method if the request was wrapped
>>>>> and if then update the parameters from it.
>>>> 
>>>> This is not my domain of expertise, but creating a new ticket with a
>>>> failing test would make this issue easier to tackle.
>>>> 
>>>> Thanks,
>>>> 
>>>> Robert
>>>> 
>>>>> 
>>>>> I think this issue is related to this ticket:
>>>>> 
>>>>> https://issues.apache.org/jira/browse/SLING-3439?jql=text%20~%20%22Pa 
>>>>> <https://issues.apache.org/jira/browse/SLING-3439?jql=text%20~%20%22Pa> 
>>>>> <https://issues.apache.org/jira/browse/SLING-3439?jql=text%20~%20%22Pa 
>>>>> <https://issues.apache.org/jira/browse/SLING-3439?jql=text%20~%20%22Pa>>
>>>>> rameterSupport%22 <https://issues.apache.org/jira/browse/SLING- 
>>>>> <https://issues.apache.org/jira/browse/SLING-> 
>>>>> <https://issues.apache.org/jira/browse/SLING- 
>>>>> <https://issues.apache.org/jira/browse/SLING->>
>>>>> 3439?jql=text%20~%20%22ParameterSupport%22>
>>>>> 
>>>>> Cheers - Andy Schaefer
> 

Reply via email to