You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@jena.apache.org by Andy Seaborne <an...@apache.org> on 2020/02/25 18:37:51 UTC
Re: Enable Cross-origin resource sharing (CORS) on embedded Fuseki
(jetty)
JENA-1294
I've put in a fixed setup activated by "--cors" - I'd be obliged if
people would try it out and let us know if it works.
It's in the latest development build #1834.
Thanks
Andy
On 29/01/2020 11:28, Andy Seaborne wrote:
> Barry - thanks for the report
>
> On 28/01/2020 19:28, Nouwt, B. (Barry) wrote:
>> Hi all,
>>
>> I enabled CORS on embedded Fuseki (when handling YASGUI SPARQL
>> requests) and wanted to share the way I did it for others' benefit. It
>> took me a while to figure out how to do this. I found instructions on
>> how to enable CORS via the web.xml, but the embedded Fuseki does not
>> use a web.xml (as far as I am aware). I also found a lot of examples
>> on how to add the CORS filter in Jetty when you control when filters
>> are added. The code at the end of the email enables it in my setup.
>
> You are correct - Fuseki main is not a webapp, no war file.
> Fuseki Full, a webapp, does put the CORS filter in.
>
> I thought that servlet filters got added before the Fuseki main filter
> but it sounds like that is not your experience. That would be a bug.
> Could you file a JIRA please? As your code show, getting the order right
> is ... a bit opaque.
>
> The complication is that the Fuseki filter catches "/*" (any URL)
> because the valid names can change as datasets are added to registry
> which is possible at run time.
>
> It might need both "before" and "after" filters.
>
> And/or : It might be a good idea to have an "enableCORS" setting to the
> Fuseki Server builder which will need its own configuration.
>
> Andy
>
>>
>> Some remarks:
>> - as far as I could see, Fuseki builder does not allow custom filters
>> to be chained/configured before the FusekiFilter (which intercepts all
>> traffic to datasets).
>> - adding the CORS filter after the FusekiFilter does not work in case
>> of a SPARQL request to a particular dataset, because FusekiFilter
>> intercepts its and prevents it from continuing through the filter chain.
>> - the above two remarks forced me to add the CORS filter directly to
>> the Jetty Server, however, it does not allow insertion of filters
>> before other filters, it only supports adding it to the end of the chain.
>> - After succeeding to add my filter before the FusekiFilter, it still
>> did not work, because (after some searching) a FilterMapping (to a
>> particular path) is also required.
>> - So, the not so elegant code below retrieves both the filters and the
>> filtermappings and inserts the filter (and filtermapping) before the
>> FusekiFilter.
>>
>> Maybe someone can check whether there is an easier way to enable it
>> and hopefully it saves somebody a few hours in the future!
>>
>> Regards, Barry
>>
>> ----------- code to enable CORS for embedded fuseki (note that this
>> code is not directly runnable)------------------------------
>> //... configure server through builder ...
>>
>> server = builder.build();
>>
>> Server jettyServer = server.getJettyServer();
>>
>> /*
>> * trying to add the cross origin filter. Fuseki adds its
>> FusekiFilter as the
>> * first and this one consumes a SPARQL request to a particular
>> dataset. So, to
>> * be able to add the cross origin filter, we have to add it BEFORE the
>> * FusekiFilter. This is not as easy as it looks, because you need to
>> add the
>> * filter as a filter and as a filtermapping to the /* pathspec.
>> */
>> Handler handler = jettyServer.getHandler();
>> FilterHolder holder = new FilterHolder(CrossOriginFilter.class);
>> // we use the default CrossOriginFilter settings, but you can specify
>> them.
>> //holder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, "*");
>> //holder.setInitParameter(CrossOriginFilter.ACCESS_CONTROL_ALLOW_ORIGIN_HEADER,
>> "*");
>> //holder.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM,
>> "GET,POST,HEAD,OPTIONS");
>> // holder.setInitParameter(CrossOriginFilter.ALLOWED_HEADERS_PARAM,
>> // "X-Requested-With,Content-Type,Accept,Origin");
>> assert (handler instanceof ServletContextHandler);
>> ServletContextHandler h = (ServletContextHandler) handler;
>> ServletHandler servletHandler = h.getServletHandler();
>> List<FilterMapping> mappings = new
>> ArrayList<FilterMapping>(Arrays.asList(servletHandler.getFilterMappings()));
>>
>> List<FilterHolder> holders = new
>> ArrayList<FilterHolder>(Arrays.asList(servletHandler.getFilters()));
>> FilterMapping mapping = new FilterMapping();
>> mapping.setFilterName(holder.getName());
>> mapping.setPathSpec("/*");
>> mapping.setDispatcherTypes(EnumSet.of(DispatcherType.REQUEST));
>> mappings.add(0, mapping);
>> holders.add(0, holder);
>> FilterMapping[] mappings3 = new FilterMapping[mappings.size()];
>> mappings3 = mappings.toArray(mappings3);
>> FilterHolder[] holders3 = new FilterHolder[holders.size()];
>> holders3 = holders.toArray(holders3);
>> servletHandler.setFilters(holders3);
>> servletHandler.setFilterMappings(mappings3);
>>
>> server.start();
>> This message may contain information that is not intended for you. If
>> you are not the addressee or if this message was sent to you by
>> mistake, you are requested to inform the sender and delete the
>> message. TNO accepts no liability for the content of this e-mail, for
>> the manner in which you use it and for damage of any kind resulting
>> from the risks inherent to the electronic transmission of messages.
>>
RE: Enable Cross-origin resource sharing (CORS) on embedded Fuseki
(jetty)
Posted by "Nouwt, B. (Barry)" <ba...@tno.nl.INVALID>.
Hi Andy, thanks for the pointers. I've tested the 3.15.0-SNAPSHOT and I can confirm that your FusekiBuilder.enableCors(true) property indeed enables Cross-Origin Resource Sharing on the Fuseki Server. If Fuseki receives a request from the YASGUI instance on another domain, it returns the following cors headers:
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://localhost:1234
Access-Control-Expose-Headers: Cache-Control, Content-Language, Content-Length, Content-Type, Expires, Last-Modified, Pragma
Once Apache Jena 3.15.0 comes out I will remove my ugly CORS code that I posted before and replace it by your elegant builder property.
Thank you very much!
Regards, Barry
-----Original Message-----
From: Andy Seaborne <an...@apache.org>
Sent: vrijdag 28 februari 2020 15:39
To: users@jena.apache.org
Subject: Re: Enable Cross-origin resource sharing (CORS) on embedded Fuseki (jetty)
Yes, JENA-1846. I have no idea why I wrote 1294.
Development builds are at https://repository.apache.org/snapshots
Jena version 3.15.0-SNAPSHOT
<repositories>
<repository>
<id>apache.snapshots</id>
<name>Apache Snapshot Repository</name>
<url>https://repository.apache.org/snapshots</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
Thanks
Andy
On 28/02/2020 09:41, Nouwt, B. (Barry) wrote:
> Hi Andy, thanks for filing the JIRA. I'm unsure whether JENA-1294 is the correct issue, it seems JENA-1846 describes it better.
>
> Is it possible to use a development build using maven? If so, I might be able to test it.
>
> Regards, Barry
>
> -----Original Message-----
> From: Andy Seaborne <an...@apache.org>
> Sent: dinsdag 25 februari 2020 19:38
> To: users@jena.apache.org
> Subject: Re: Enable Cross-origin resource sharing (CORS) on embedded
> Fuseki (jetty)
>
> JENA-1294
>
> I've put in a fixed setup activated by "--cors" - I'd be obliged if people would try it out and let us know if it works.
>
> It's in the latest development build #1834.
>
> Thanks
> Andy
>
>
> On 29/01/2020 11:28, Andy Seaborne wrote:
>> Barry - thanks for the report
>>
>> On 28/01/2020 19:28, Nouwt, B. (Barry) wrote:
>>> Hi all,
>>>
>>> I enabled CORS on embedded Fuseki (when handling YASGUI SPARQL
>>> requests) and wanted to share the way I did it for others' benefit.
>>> It took me a while to figure out how to do this. I found
>>> instructions on how to enable CORS via the web.xml, but the embedded
>>> Fuseki does not use a web.xml (as far as I am aware). I also found a
>>> lot of examples on how to add the CORS filter in Jetty when you
>>> control when filters are added. The code at the end of the email enables it in my setup.
>>
>> You are correct - Fuseki main is not a webapp, no war file.
>> Fuseki Full, a webapp, does put the CORS filter in.
>>
>> I thought that servlet filters got added before the Fuseki main
>> filter but it sounds like that is not your experience. That would be a bug.
>> Could you file a JIRA please? As your code show, getting the order
>> right is ... a bit opaque.
>>
>> The complication is that the Fuseki filter catches "/*" (any URL)
>> because the valid names can change as datasets are added to registry
>> which is possible at run time.
>>
>> It might need both "before" and "after" filters.
>>
>> And/or : It might be a good idea to have an "enableCORS" setting to
>> the Fuseki Server builder which will need its own configuration.
>>
>> Andy
>>
>>>
>>> Some remarks:
>>> - as far as I could see, Fuseki builder does not allow custom
>>> filters to be chained/configured before the FusekiFilter (which
>>> intercepts all traffic to datasets).
>>> - adding the CORS filter after the FusekiFilter does not work in
>>> case of a SPARQL request to a particular dataset, because
>>> FusekiFilter intercepts its and prevents it from continuing through the filter chain.
>>> - the above two remarks forced me to add the CORS filter directly to
>>> the Jetty Server, however, it does not allow insertion of filters
>>> before other filters, it only supports adding it to the end of the chain.
>>> - After succeeding to add my filter before the FusekiFilter, it
>>> still did not work, because (after some searching) a FilterMapping
>>> (to a particular path) is also required.
>>> - So, the not so elegant code below retrieves both the filters and
>>> the filtermappings and inserts the filter (and filtermapping) before
>>> the FusekiFilter.
>>>
>>> Maybe someone can check whether there is an easier way to enable it
>>> and hopefully it saves somebody a few hours in the future!
>>>
>>> Regards, Barry
>>>
>>> ----------- code to enable CORS for embedded fuseki (note that this
>>> code is not directly runnable)------------------------------
>>> //... configure server through builder ...
>>>
>>> server = builder.build();
>>>
>>> Server jettyServer = server.getJettyServer();
>>>
>>> /*
>>> * trying to add the cross origin filter. Fuseki adds its
>>> FusekiFilter as the
>>> * first and this one consumes a SPARQL request to a particular
>>> dataset. So, to
>>> * be able to add the cross origin filter, we have to add it
>>> BEFORE the
>>> * FusekiFilter. This is not as easy as it looks, because you need
>>> to add the
>>> * filter as a filter and as a filtermapping to the /* pathspec.
>>> */
>>> Handler handler = jettyServer.getHandler(); FilterHolder holder =
>>> new FilterHolder(CrossOriginFilter.class);
>>> // we use the default CrossOriginFilter settings, but you can
>>> specify them.
>>> //holder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM,
>>> "*");
>>> //holder.setInitParameter(CrossOriginFilter.ACCESS_CONTROL_ALLOW_ORI
>>> G
>>> IN_HEADER,
>>> "*");
>>> //holder.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM,
>>> "GET,POST,HEAD,OPTIONS");
>>> // holder.setInitParameter(CrossOriginFilter.ALLOWED_HEADERS_PARAM,
>>> // "X-Requested-With,Content-Type,Accept,Origin");
>>> assert (handler instanceof ServletContextHandler);
>>> ServletContextHandler h = (ServletContextHandler) handler;
>>> ServletHandler servletHandler = h.getServletHandler();
>>> List<FilterMapping> mappings = new
>>> ArrayList<FilterMapping>(Arrays.asList(servletHandler.getFilterMappi
>>> n
>>> gs()));
>>>
>>> List<FilterHolder> holders = new
>>> ArrayList<FilterHolder>(Arrays.asList(servletHandler.getFilters()));
>>> FilterMapping mapping = new FilterMapping();
>>> mapping.setFilterName(holder.getName());
>>> mapping.setPathSpec("/*");
>>> mapping.setDispatcherTypes(EnumSet.of(DispatcherType.REQUEST));
>>> mappings.add(0, mapping);
>>> holders.add(0, holder);
>>> FilterMapping[] mappings3 = new FilterMapping[mappings.size()];
>>> mappings3 = mappings.toArray(mappings3); FilterHolder[] holders3 =
>>> new FilterHolder[holders.size()];
>>> holders3 = holders.toArray(holders3);
>>> servletHandler.setFilters(holders3);
>>> servletHandler.setFilterMappings(mappings3);
>>>
>>> server.start();
>>> This message may contain information that is not intended for you.
>>> If you are not the addressee or if this message was sent to you by
>>> mistake, you are requested to inform the sender and delete the
>>> message. TNO accepts no liability for the content of this e-mail,
>>> for the manner in which you use it and for damage of any kind
>>> resulting from the risks inherent to the electronic transmission of messages.
>>>
Re: Enable Cross-origin resource sharing (CORS) on embedded Fuseki
(jetty)
Posted by Andy Seaborne <an...@apache.org>.
Yes, JENA-1846. I have no idea why I wrote 1294.
Development builds are at https://repository.apache.org/snapshots
Jena version 3.15.0-SNAPSHOT
<repositories>
<repository>
<id>apache.snapshots</id>
<name>Apache Snapshot Repository</name>
<url>https://repository.apache.org/snapshots</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
Thanks
Andy
On 28/02/2020 09:41, Nouwt, B. (Barry) wrote:
> Hi Andy, thanks for filing the JIRA. I'm unsure whether JENA-1294 is the correct issue, it seems JENA-1846 describes it better.
>
> Is it possible to use a development build using maven? If so, I might be able to test it.
>
> Regards, Barry
>
> -----Original Message-----
> From: Andy Seaborne <an...@apache.org>
> Sent: dinsdag 25 februari 2020 19:38
> To: users@jena.apache.org
> Subject: Re: Enable Cross-origin resource sharing (CORS) on embedded Fuseki (jetty)
>
> JENA-1294
>
> I've put in a fixed setup activated by "--cors" - I'd be obliged if people would try it out and let us know if it works.
>
> It's in the latest development build #1834.
>
> Thanks
> Andy
>
>
> On 29/01/2020 11:28, Andy Seaborne wrote:
>> Barry - thanks for the report
>>
>> On 28/01/2020 19:28, Nouwt, B. (Barry) wrote:
>>> Hi all,
>>>
>>> I enabled CORS on embedded Fuseki (when handling YASGUI SPARQL
>>> requests) and wanted to share the way I did it for others' benefit.
>>> It took me a while to figure out how to do this. I found instructions
>>> on how to enable CORS via the web.xml, but the embedded Fuseki does
>>> not use a web.xml (as far as I am aware). I also found a lot of
>>> examples on how to add the CORS filter in Jetty when you control when
>>> filters are added. The code at the end of the email enables it in my setup.
>>
>> You are correct - Fuseki main is not a webapp, no war file.
>> Fuseki Full, a webapp, does put the CORS filter in.
>>
>> I thought that servlet filters got added before the Fuseki main filter
>> but it sounds like that is not your experience. That would be a bug.
>> Could you file a JIRA please? As your code show, getting the order
>> right is ... a bit opaque.
>>
>> The complication is that the Fuseki filter catches "/*" (any URL)
>> because the valid names can change as datasets are added to registry
>> which is possible at run time.
>>
>> It might need both "before" and "after" filters.
>>
>> And/or : It might be a good idea to have an "enableCORS" setting to
>> the Fuseki Server builder which will need its own configuration.
>>
>> Andy
>>
>>>
>>> Some remarks:
>>> - as far as I could see, Fuseki builder does not allow custom filters
>>> to be chained/configured before the FusekiFilter (which intercepts
>>> all traffic to datasets).
>>> - adding the CORS filter after the FusekiFilter does not work in case
>>> of a SPARQL request to a particular dataset, because FusekiFilter
>>> intercepts its and prevents it from continuing through the filter chain.
>>> - the above two remarks forced me to add the CORS filter directly to
>>> the Jetty Server, however, it does not allow insertion of filters
>>> before other filters, it only supports adding it to the end of the chain.
>>> - After succeeding to add my filter before the FusekiFilter, it still
>>> did not work, because (after some searching) a FilterMapping (to a
>>> particular path) is also required.
>>> - So, the not so elegant code below retrieves both the filters and
>>> the filtermappings and inserts the filter (and filtermapping) before
>>> the FusekiFilter.
>>>
>>> Maybe someone can check whether there is an easier way to enable it
>>> and hopefully it saves somebody a few hours in the future!
>>>
>>> Regards, Barry
>>>
>>> ----------- code to enable CORS for embedded fuseki (note that this
>>> code is not directly runnable)------------------------------
>>> //... configure server through builder ...
>>>
>>> server = builder.build();
>>>
>>> Server jettyServer = server.getJettyServer();
>>>
>>> /*
>>> * trying to add the cross origin filter. Fuseki adds its
>>> FusekiFilter as the
>>> * first and this one consumes a SPARQL request to a particular
>>> dataset. So, to
>>> * be able to add the cross origin filter, we have to add it BEFORE
>>> the
>>> * FusekiFilter. This is not as easy as it looks, because you need
>>> to add the
>>> * filter as a filter and as a filtermapping to the /* pathspec.
>>> */
>>> Handler handler = jettyServer.getHandler(); FilterHolder holder = new
>>> FilterHolder(CrossOriginFilter.class);
>>> // we use the default CrossOriginFilter settings, but you can specify
>>> them.
>>> //holder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM,
>>> "*");
>>> //holder.setInitParameter(CrossOriginFilter.ACCESS_CONTROL_ALLOW_ORIG
>>> IN_HEADER,
>>> "*");
>>> //holder.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM,
>>> "GET,POST,HEAD,OPTIONS");
>>> // holder.setInitParameter(CrossOriginFilter.ALLOWED_HEADERS_PARAM,
>>> // "X-Requested-With,Content-Type,Accept,Origin");
>>> assert (handler instanceof ServletContextHandler);
>>> ServletContextHandler h = (ServletContextHandler) handler;
>>> ServletHandler servletHandler = h.getServletHandler();
>>> List<FilterMapping> mappings = new
>>> ArrayList<FilterMapping>(Arrays.asList(servletHandler.getFilterMappin
>>> gs()));
>>>
>>> List<FilterHolder> holders = new
>>> ArrayList<FilterHolder>(Arrays.asList(servletHandler.getFilters()));
>>> FilterMapping mapping = new FilterMapping();
>>> mapping.setFilterName(holder.getName());
>>> mapping.setPathSpec("/*");
>>> mapping.setDispatcherTypes(EnumSet.of(DispatcherType.REQUEST));
>>> mappings.add(0, mapping);
>>> holders.add(0, holder);
>>> FilterMapping[] mappings3 = new FilterMapping[mappings.size()];
>>> mappings3 = mappings.toArray(mappings3); FilterHolder[] holders3 =
>>> new FilterHolder[holders.size()];
>>> holders3 = holders.toArray(holders3);
>>> servletHandler.setFilters(holders3);
>>> servletHandler.setFilterMappings(mappings3);
>>>
>>> server.start();
>>> This message may contain information that is not intended for you. If
>>> you are not the addressee or if this message was sent to you by
>>> mistake, you are requested to inform the sender and delete the
>>> message. TNO accepts no liability for the content of this e-mail, for
>>> the manner in which you use it and for damage of any kind resulting
>>> from the risks inherent to the electronic transmission of messages.
>>>
RE: Enable Cross-origin resource sharing (CORS) on embedded Fuseki
(jetty)
Posted by "Nouwt, B. (Barry)" <ba...@tno.nl.INVALID>.
Hi Andy, thanks for filing the JIRA. I'm unsure whether JENA-1294 is the correct issue, it seems JENA-1846 describes it better.
Is it possible to use a development build using maven? If so, I might be able to test it.
Regards, Barry
-----Original Message-----
From: Andy Seaborne <an...@apache.org>
Sent: dinsdag 25 februari 2020 19:38
To: users@jena.apache.org
Subject: Re: Enable Cross-origin resource sharing (CORS) on embedded Fuseki (jetty)
JENA-1294
I've put in a fixed setup activated by "--cors" - I'd be obliged if people would try it out and let us know if it works.
It's in the latest development build #1834.
Thanks
Andy
On 29/01/2020 11:28, Andy Seaborne wrote:
> Barry - thanks for the report
>
> On 28/01/2020 19:28, Nouwt, B. (Barry) wrote:
>> Hi all,
>>
>> I enabled CORS on embedded Fuseki (when handling YASGUI SPARQL
>> requests) and wanted to share the way I did it for others' benefit.
>> It took me a while to figure out how to do this. I found instructions
>> on how to enable CORS via the web.xml, but the embedded Fuseki does
>> not use a web.xml (as far as I am aware). I also found a lot of
>> examples on how to add the CORS filter in Jetty when you control when
>> filters are added. The code at the end of the email enables it in my setup.
>
> You are correct - Fuseki main is not a webapp, no war file.
> Fuseki Full, a webapp, does put the CORS filter in.
>
> I thought that servlet filters got added before the Fuseki main filter
> but it sounds like that is not your experience. That would be a bug.
> Could you file a JIRA please? As your code show, getting the order
> right is ... a bit opaque.
>
> The complication is that the Fuseki filter catches "/*" (any URL)
> because the valid names can change as datasets are added to registry
> which is possible at run time.
>
> It might need both "before" and "after" filters.
>
> And/or : It might be a good idea to have an "enableCORS" setting to
> the Fuseki Server builder which will need its own configuration.
>
> Andy
>
>>
>> Some remarks:
>> - as far as I could see, Fuseki builder does not allow custom filters
>> to be chained/configured before the FusekiFilter (which intercepts
>> all traffic to datasets).
>> - adding the CORS filter after the FusekiFilter does not work in case
>> of a SPARQL request to a particular dataset, because FusekiFilter
>> intercepts its and prevents it from continuing through the filter chain.
>> - the above two remarks forced me to add the CORS filter directly to
>> the Jetty Server, however, it does not allow insertion of filters
>> before other filters, it only supports adding it to the end of the chain.
>> - After succeeding to add my filter before the FusekiFilter, it still
>> did not work, because (after some searching) a FilterMapping (to a
>> particular path) is also required.
>> - So, the not so elegant code below retrieves both the filters and
>> the filtermappings and inserts the filter (and filtermapping) before
>> the FusekiFilter.
>>
>> Maybe someone can check whether there is an easier way to enable it
>> and hopefully it saves somebody a few hours in the future!
>>
>> Regards, Barry
>>
>> ----------- code to enable CORS for embedded fuseki (note that this
>> code is not directly runnable)------------------------------
>> //... configure server through builder ...
>>
>> server = builder.build();
>>
>> Server jettyServer = server.getJettyServer();
>>
>> /*
>> * trying to add the cross origin filter. Fuseki adds its
>> FusekiFilter as the
>> * first and this one consumes a SPARQL request to a particular
>> dataset. So, to
>> * be able to add the cross origin filter, we have to add it BEFORE
>> the
>> * FusekiFilter. This is not as easy as it looks, because you need
>> to add the
>> * filter as a filter and as a filtermapping to the /* pathspec.
>> */
>> Handler handler = jettyServer.getHandler(); FilterHolder holder = new
>> FilterHolder(CrossOriginFilter.class);
>> // we use the default CrossOriginFilter settings, but you can specify
>> them.
>> //holder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM,
>> "*");
>> //holder.setInitParameter(CrossOriginFilter.ACCESS_CONTROL_ALLOW_ORIG
>> IN_HEADER,
>> "*");
>> //holder.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM,
>> "GET,POST,HEAD,OPTIONS");
>> // holder.setInitParameter(CrossOriginFilter.ALLOWED_HEADERS_PARAM,
>> // "X-Requested-With,Content-Type,Accept,Origin");
>> assert (handler instanceof ServletContextHandler);
>> ServletContextHandler h = (ServletContextHandler) handler;
>> ServletHandler servletHandler = h.getServletHandler();
>> List<FilterMapping> mappings = new
>> ArrayList<FilterMapping>(Arrays.asList(servletHandler.getFilterMappin
>> gs()));
>>
>> List<FilterHolder> holders = new
>> ArrayList<FilterHolder>(Arrays.asList(servletHandler.getFilters()));
>> FilterMapping mapping = new FilterMapping();
>> mapping.setFilterName(holder.getName());
>> mapping.setPathSpec("/*");
>> mapping.setDispatcherTypes(EnumSet.of(DispatcherType.REQUEST));
>> mappings.add(0, mapping);
>> holders.add(0, holder);
>> FilterMapping[] mappings3 = new FilterMapping[mappings.size()];
>> mappings3 = mappings.toArray(mappings3); FilterHolder[] holders3 =
>> new FilterHolder[holders.size()];
>> holders3 = holders.toArray(holders3);
>> servletHandler.setFilters(holders3);
>> servletHandler.setFilterMappings(mappings3);
>>
>> server.start();
>> This message may contain information that is not intended for you. If
>> you are not the addressee or if this message was sent to you by
>> mistake, you are requested to inform the sender and delete the
>> message. TNO accepts no liability for the content of this e-mail, for
>> the manner in which you use it and for damage of any kind resulting
>> from the risks inherent to the electronic transmission of messages.
>>