You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Bruno Cappoen <b....@gmail.com> on 2012/10/24 23:35:11 UTC

Overriding a specific interceptor from the cxf bus

Hi everybody, i'm using a LoggingInInterceptor on the cxf bus to log
all the requests of my webservices.
It works perfectly.
In my webservices, i have a secure webservice for authentication. The
password is in the request (payload) and it is displayed
in the log.

Is it possible to disable the LoggingInInterceptor for a specific
webservice ? Have you got a solution ?

I don't want to specify for each webservice the interceptor because i
have many webservices and here, it's a specific need.


Thank you for your help.



<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:cxf="http://cxf.apache.org/core"
      xsi:schemaLocation="http://cxf.apache.org/core
http://cxf.apache.org/schemas/core.xsdhttp://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

    <bean id="logInbound"
class="org.apache.cxf.interceptor.LoggingInInterceptor"/>


    <cxf:bus>
        <cxf:outInterceptors>
            <ref bean="logInbound"/>
        </cxf:outInterceptors>
    </cxf:bus> </beans>

Re: Overriding a specific interceptor from the cxf bus

Posted by Bruno Cappoen <b....@gmail.com>.
Finally, i used that solution. Thanks.

public class MyLoggingOutInterceptor extends LoggingOutInterceptor
{

    @Override
    protected String transform(String originalLogString) {

        if (originalLogString.contains("authentication")) {
            return originalLogString.replaceAll("<password>.*</password>",
"<password>*****</password>");
        }

        return originalLogString;
    }

}

2012/10/25 Jason Pell <ja...@pellcorp.com>

> I don't think its as easy for that one.  However what you can do is
> just remove the LoggingOutInterceptor from the current interceptor
> chain.  We have a method to do that in our code that you can use:
>
> public static void removeInterceptor(Class<? extends Interceptor<?>>
> interceptorType, Message message) {
>                 Iterator<Interceptor<? extends Message>> iterator =
> message.getInterceptorChain().iterator();
>
>                 Interceptor<?> removeInterceptor = null;
>                 for (; iterator.hasNext();) {
>                         Interceptor<?> interceptor = iterator.next();
>                         if (interceptorType.isInstance(interceptor)) {
>                                 removeInterceptor = interceptor;
>                                 break;
>                         }
>                 }
>
>                 if (removeInterceptor != null) {
>                         LOGGER.debug("Removing interceptor {}",
> removeInterceptor.getClass().getName());
>
> message.getInterceptorChain().remove(removeInterceptor);
>                 }
>         }
>
> There might be a code in CXF but I have not found it.
>
> So basically what you could do is this:
>
> removeInterceptor(LoggingOutInterceptor.class, message);
>
> On Thu, Oct 25, 2012 at 8:50 PM, Bruno Cappoen <b....@gmail.com>
> wrote:
> > Hi, thanks. The endpoint of this service is not in my application. I
> made a
> > mistake, it's LoggingOutInterceptor. We use a remote service and we can't
> > modify this service, so we can't add a key.
> >
> > <jaxws:client id="helloClient"
> >                 serviceClass="demo.spring.HelloWorld"
> >                 address="http://localhost:9002/HelloWorld">
> >     <jaxws:inInterceptors>
> >       <ref bean="removeLoggingInInterceptorInterceptor"/>
> >     </jaxws:inInterceptor>
> >
> > *
> > *
> >
> > I don't see what i must put in the
> > RemoveLoggingInInterceptorInterceptor to override logginOutInterceptor
> > in the cxf bus.
> >
> > *
> > *
> >
> > THanks
> >
> >
> > 2012/10/25 Jason Pell <ja...@pellcorp.com>
> >
> >> In fact what you could do is have this
> >> RemoveLoggingInInterceptorInterceptor you write defined in
> >> the specific Security Web Service jaxws:endpoint, so it does not even
> >> have to check the current
> >> endpoint info.  If its defined for an endpoint it automatically
> >> removes the interceptor.
> >>
> >> An alternative to removing the interceptor would be to trick the
> >> interceptor into not
> >> executing any logging.  If you check the start of the interceptor it
> >> has the code:
> >>
> >> if (message.containsKey(LoggingMessage.ID_KEY)) {
> >>             return;
> >>         }
> >>
> >> You could in your custom interceptor add this key to the message so
> >> that the above
> >> if evaluates to true.  Just make sure the interceptor is registered to
> >> runBefore LoggingInInterceptor
> >>
> >>
> >> On Thu, Oct 25, 2012 at 10:47 AM, Jason Pell <ja...@pellcorp.com>
> wrote:
> >> > I am sure there is a better way - but what you could do is add an
> >> > additional interceptor that executes as part of the SETUP phase.  This
> >> > would check what endpoint it is on and optionally remove the
> >> > LoggingInInterceptor from the current execution chain.
> >> >
> >> > I am sure others will have better solutions
> >> >
> >> > On Thu, Oct 25, 2012 at 8:35 AM, Bruno Cappoen <b....@gmail.com>
> >> wrote:
> >> >> Hi everybody, i'm using a LoggingInInterceptor on the cxf bus to log
> >> >> all the requests of my webservices.
> >> >> It works perfectly.
> >> >> In my webservices, i have a secure webservice for authentication. The
> >> >> password is in the request (payload) and it is displayed
> >> >> in the log.
> >> >>
> >> >> Is it possible to disable the LoggingInInterceptor for a specific
> >> >> webservice ? Have you got a solution ?
> >> >>
> >> >> I don't want to specify for each webservice the interceptor because i
> >> >> have many webservices and here, it's a specific need.
> >> >>
> >> >>
> >> >> Thank you for your help.
> >> >>
> >> >>
> >> >>
> >> >> <beans xmlns="http://www.springframework.org/schema/beans"
> >> >>       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> >> >>       xmlns:cxf="http://cxf.apache.org/core"
> >> >>       xsi:schemaLocation="http://cxf.apache.org/core
> >> >>
> >>
> http://cxf.apache.org/schemas/core.xsdhttp://www.springframework.org/schema/beans
> >> >> http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
> >> >>
> >> >>     <bean id="logInbound"
> >> >> class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
> >> >>
> >> >>
> >> >>     <cxf:bus>
> >> >>         <cxf:outInterceptors>
> >> >>             <ref bean="logInbound"/>
> >> >>         </cxf:outInterceptors>
> >> >>     </cxf:bus> </beans>
> >>
>

Re: Overriding a specific interceptor from the cxf bus

Posted by Jason Pell <ja...@pellcorp.com>.
I don't think its as easy for that one.  However what you can do is
just remove the LoggingOutInterceptor from the current interceptor
chain.  We have a method to do that in our code that you can use:

public static void removeInterceptor(Class<? extends Interceptor<?>>
interceptorType, Message message) {
		Iterator<Interceptor<? extends Message>> iterator =
message.getInterceptorChain().iterator();
		
		Interceptor<?> removeInterceptor = null;
		for (; iterator.hasNext();) {
			Interceptor<?> interceptor = iterator.next();
			if (interceptorType.isInstance(interceptor)) {
				removeInterceptor = interceptor;
				break;
			}
		}
		
		if (removeInterceptor != null) {
			LOGGER.debug("Removing interceptor {}",
removeInterceptor.getClass().getName());
			message.getInterceptorChain().remove(removeInterceptor);
		}
	}

There might be a code in CXF but I have not found it.

So basically what you could do is this:

removeInterceptor(LoggingOutInterceptor.class, message);

On Thu, Oct 25, 2012 at 8:50 PM, Bruno Cappoen <b....@gmail.com> wrote:
> Hi, thanks. The endpoint of this service is not in my application. I made a
> mistake, it's LoggingOutInterceptor. We use a remote service and we can't
> modify this service, so we can't add a key.
>
> <jaxws:client id="helloClient"
>                 serviceClass="demo.spring.HelloWorld"
>                 address="http://localhost:9002/HelloWorld">
>     <jaxws:inInterceptors>
>       <ref bean="removeLoggingInInterceptorInterceptor"/>
>     </jaxws:inInterceptor>
>
> *
> *
>
> I don't see what i must put in the
> RemoveLoggingInInterceptorInterceptor to override logginOutInterceptor
> in the cxf bus.
>
> *
> *
>
> THanks
>
>
> 2012/10/25 Jason Pell <ja...@pellcorp.com>
>
>> In fact what you could do is have this
>> RemoveLoggingInInterceptorInterceptor you write defined in
>> the specific Security Web Service jaxws:endpoint, so it does not even
>> have to check the current
>> endpoint info.  If its defined for an endpoint it automatically
>> removes the interceptor.
>>
>> An alternative to removing the interceptor would be to trick the
>> interceptor into not
>> executing any logging.  If you check the start of the interceptor it
>> has the code:
>>
>> if (message.containsKey(LoggingMessage.ID_KEY)) {
>>             return;
>>         }
>>
>> You could in your custom interceptor add this key to the message so
>> that the above
>> if evaluates to true.  Just make sure the interceptor is registered to
>> runBefore LoggingInInterceptor
>>
>>
>> On Thu, Oct 25, 2012 at 10:47 AM, Jason Pell <ja...@pellcorp.com> wrote:
>> > I am sure there is a better way - but what you could do is add an
>> > additional interceptor that executes as part of the SETUP phase.  This
>> > would check what endpoint it is on and optionally remove the
>> > LoggingInInterceptor from the current execution chain.
>> >
>> > I am sure others will have better solutions
>> >
>> > On Thu, Oct 25, 2012 at 8:35 AM, Bruno Cappoen <b....@gmail.com>
>> wrote:
>> >> Hi everybody, i'm using a LoggingInInterceptor on the cxf bus to log
>> >> all the requests of my webservices.
>> >> It works perfectly.
>> >> In my webservices, i have a secure webservice for authentication. The
>> >> password is in the request (payload) and it is displayed
>> >> in the log.
>> >>
>> >> Is it possible to disable the LoggingInInterceptor for a specific
>> >> webservice ? Have you got a solution ?
>> >>
>> >> I don't want to specify for each webservice the interceptor because i
>> >> have many webservices and here, it's a specific need.
>> >>
>> >>
>> >> Thank you for your help.
>> >>
>> >>
>> >>
>> >> <beans xmlns="http://www.springframework.org/schema/beans"
>> >>       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>> >>       xmlns:cxf="http://cxf.apache.org/core"
>> >>       xsi:schemaLocation="http://cxf.apache.org/core
>> >>
>> http://cxf.apache.org/schemas/core.xsdhttp://www.springframework.org/schema/beans
>> >> http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
>> >>
>> >>     <bean id="logInbound"
>> >> class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
>> >>
>> >>
>> >>     <cxf:bus>
>> >>         <cxf:outInterceptors>
>> >>             <ref bean="logInbound"/>
>> >>         </cxf:outInterceptors>
>> >>     </cxf:bus> </beans>
>>

Re: Overriding a specific interceptor from the cxf bus

Posted by Bruno Cappoen <b....@gmail.com>.
Hi, thanks. The endpoint of this service is not in my application. I made a
mistake, it's LoggingOutInterceptor. We use a remote service and we can't
modify this service, so we can't add a key.

<jaxws:client id="helloClient"
                serviceClass="demo.spring.HelloWorld"
                address="http://localhost:9002/HelloWorld">
    <jaxws:inInterceptors>
      <ref bean="removeLoggingInInterceptorInterceptor"/>
    </jaxws:inInterceptor>

*
*

I don't see what i must put in the
RemoveLoggingInInterceptorInterceptor to override logginOutInterceptor
in the cxf bus.

*
*

THanks


2012/10/25 Jason Pell <ja...@pellcorp.com>

> In fact what you could do is have this
> RemoveLoggingInInterceptorInterceptor you write defined in
> the specific Security Web Service jaxws:endpoint, so it does not even
> have to check the current
> endpoint info.  If its defined for an endpoint it automatically
> removes the interceptor.
>
> An alternative to removing the interceptor would be to trick the
> interceptor into not
> executing any logging.  If you check the start of the interceptor it
> has the code:
>
> if (message.containsKey(LoggingMessage.ID_KEY)) {
>             return;
>         }
>
> You could in your custom interceptor add this key to the message so
> that the above
> if evaluates to true.  Just make sure the interceptor is registered to
> runBefore LoggingInInterceptor
>
>
> On Thu, Oct 25, 2012 at 10:47 AM, Jason Pell <ja...@pellcorp.com> wrote:
> > I am sure there is a better way - but what you could do is add an
> > additional interceptor that executes as part of the SETUP phase.  This
> > would check what endpoint it is on and optionally remove the
> > LoggingInInterceptor from the current execution chain.
> >
> > I am sure others will have better solutions
> >
> > On Thu, Oct 25, 2012 at 8:35 AM, Bruno Cappoen <b....@gmail.com>
> wrote:
> >> Hi everybody, i'm using a LoggingInInterceptor on the cxf bus to log
> >> all the requests of my webservices.
> >> It works perfectly.
> >> In my webservices, i have a secure webservice for authentication. The
> >> password is in the request (payload) and it is displayed
> >> in the log.
> >>
> >> Is it possible to disable the LoggingInInterceptor for a specific
> >> webservice ? Have you got a solution ?
> >>
> >> I don't want to specify for each webservice the interceptor because i
> >> have many webservices and here, it's a specific need.
> >>
> >>
> >> Thank you for your help.
> >>
> >>
> >>
> >> <beans xmlns="http://www.springframework.org/schema/beans"
> >>       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> >>       xmlns:cxf="http://cxf.apache.org/core"
> >>       xsi:schemaLocation="http://cxf.apache.org/core
> >>
> http://cxf.apache.org/schemas/core.xsdhttp://www.springframework.org/schema/beans
> >> http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
> >>
> >>     <bean id="logInbound"
> >> class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
> >>
> >>
> >>     <cxf:bus>
> >>         <cxf:outInterceptors>
> >>             <ref bean="logInbound"/>
> >>         </cxf:outInterceptors>
> >>     </cxf:bus> </beans>
>

Re: Overriding a specific interceptor from the cxf bus

Posted by Jason Pell <ja...@pellcorp.com>.
In fact what you could do is have this
RemoveLoggingInInterceptorInterceptor you write defined in
the specific Security Web Service jaxws:endpoint, so it does not even
have to check the current
endpoint info.  If its defined for an endpoint it automatically
removes the interceptor.

An alternative to removing the interceptor would be to trick the
interceptor into not
executing any logging.  If you check the start of the interceptor it
has the code:

if (message.containsKey(LoggingMessage.ID_KEY)) {
            return;
        }

You could in your custom interceptor add this key to the message so
that the above
if evaluates to true.  Just make sure the interceptor is registered to
runBefore LoggingInInterceptor


On Thu, Oct 25, 2012 at 10:47 AM, Jason Pell <ja...@pellcorp.com> wrote:
> I am sure there is a better way - but what you could do is add an
> additional interceptor that executes as part of the SETUP phase.  This
> would check what endpoint it is on and optionally remove the
> LoggingInInterceptor from the current execution chain.
>
> I am sure others will have better solutions
>
> On Thu, Oct 25, 2012 at 8:35 AM, Bruno Cappoen <b....@gmail.com> wrote:
>> Hi everybody, i'm using a LoggingInInterceptor on the cxf bus to log
>> all the requests of my webservices.
>> It works perfectly.
>> In my webservices, i have a secure webservice for authentication. The
>> password is in the request (payload) and it is displayed
>> in the log.
>>
>> Is it possible to disable the LoggingInInterceptor for a specific
>> webservice ? Have you got a solution ?
>>
>> I don't want to specify for each webservice the interceptor because i
>> have many webservices and here, it's a specific need.
>>
>>
>> Thank you for your help.
>>
>>
>>
>> <beans xmlns="http://www.springframework.org/schema/beans"
>>       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>>       xmlns:cxf="http://cxf.apache.org/core"
>>       xsi:schemaLocation="http://cxf.apache.org/core
>> http://cxf.apache.org/schemas/core.xsdhttp://www.springframework.org/schema/beans
>> http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
>>
>>     <bean id="logInbound"
>> class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
>>
>>
>>     <cxf:bus>
>>         <cxf:outInterceptors>
>>             <ref bean="logInbound"/>
>>         </cxf:outInterceptors>
>>     </cxf:bus> </beans>

Re: Overriding a specific interceptor from the cxf bus

Posted by Jason Pell <ja...@pellcorp.com>.
I am sure there is a better way - but what you could do is add an
additional interceptor that executes as part of the SETUP phase.  This
would check what endpoint it is on and optionally remove the
LoggingInInterceptor from the current execution chain.

I am sure others will have better solutions

On Thu, Oct 25, 2012 at 8:35 AM, Bruno Cappoen <b....@gmail.com> wrote:
> Hi everybody, i'm using a LoggingInInterceptor on the cxf bus to log
> all the requests of my webservices.
> It works perfectly.
> In my webservices, i have a secure webservice for authentication. The
> password is in the request (payload) and it is displayed
> in the log.
>
> Is it possible to disable the LoggingInInterceptor for a specific
> webservice ? Have you got a solution ?
>
> I don't want to specify for each webservice the interceptor because i
> have many webservices and here, it's a specific need.
>
>
> Thank you for your help.
>
>
>
> <beans xmlns="http://www.springframework.org/schema/beans"
>       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>       xmlns:cxf="http://cxf.apache.org/core"
>       xsi:schemaLocation="http://cxf.apache.org/core
> http://cxf.apache.org/schemas/core.xsdhttp://www.springframework.org/schema/beans
> http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
>
>     <bean id="logInbound"
> class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
>
>
>     <cxf:bus>
>         <cxf:outInterceptors>
>             <ref bean="logInbound"/>
>         </cxf:outInterceptors>
>     </cxf:bus> </beans>