You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-user@axis.apache.org by Amila Suriarachchi <am...@gmail.com> on 2009/09/01 06:48:56 UTC
Re: how to skip a Phase?
should be ok
msgContext.setProperty(MessageContext.REMOTE_ADDR, request.getRemoteAddr());
it gets the remoteAddress of the httpServletRequest object.
thanks,
Amila.
On Tue, Sep 1, 2009 at 12:56 AM, Alexis Midon <mi...@intalio.com> wrote:
> Hi Deepal and Amila,
> thank you guys for your answers. I concede that my use case might sound
> strange and out of the standard path.
> Anyway I implemented the following handler witch seems to work fine so far.
> I post it here for the records and to ask confirmation from you that the
> property MessageContext.REMOTE_ADDR is the right property to check.
>
> Thanks again for your help,
>
> Alexis
>
>
> public class NoSecurityForLocalhostHandler extends AbstractHandler {
>
> private static final Log log =
> LogFactory.getLog(NoSecurityForLocalhostHandler.class);
>
> List ips = new ArrayList();
>
> public NoSecurityForLocalhostHandler() throws SocketException {
> Enumeration<NetworkInterface> e1 =
> NetworkInterface.getNetworkInterfaces();
> while (e1.hasMoreElements()) {
> NetworkInterface ni = e1.nextElement();
> Enumeration<InetAddress> e2 = ni.getInetAddresses();
> while (e2.hasMoreElements()) {
> InetAddress ia = e2.nextElement();
> ips.add(ia.getHostAddress());
> }
> }
> }
>
> public InvocationResponse invoke(MessageContext msgContext) throws
> AxisFault {
> log.debug("Check if Security phase should be skipped");
> String remoteAddr = (String)
> msgContext.getProperty(MessageContext.REMOTE_ADDR);
> if (remoteAddr == null) {
> log.debug("No REMOTE_ADDR in message context");
> } else {
> log.debug("REMOTE_ADDR is " + remoteAddr);
> if (ips.contains(remoteAddr)) {
> log.debug("Remote address matches a local address. The
> Security phase will be removed (if any)");
> for (int i = 0; i < msgContext.getExecutionChain().size();
> i++) {
> Phase phase = (Phase)
> msgContext.getExecutionChain().get(i);
> if ("Security".equalsIgnoreCase(phase.getName())) {
> msgContext.getExecutionChain().remove(phase);
> log.debug("Security phase actually removed");
> break;
> }
> }
> } else {
> log.debug("Remote address is not local");
> }
> }
> return InvocationResponse.CONTINUE;
> }
> }
>
>
>
> On Tue, Aug 25, 2009 at 9:45 PM, Amila Suriarachchi <
> amilasuriarachchi@gmail.com> wrote:
>
>>
>>
>> On Tue, Aug 25, 2009 at 11:24 PM, Alexis Midon <mi...@intalio.com> wrote:
>>
>>> Hey there,
>>>
>>> I'm trying to dynamically skip a phase. Let me explain.
>>> Let's say I have defined the following phases as InFlow: Transport,
>>> Security, Dispatch, OperationInPhase. I want to skip the Security phase in
>>> some cases, in other words I want the phase order to become [Transport,
>>> Dispatch, OperationInPhase].
>>>
>>> I've tried to insert my decision test (skip Security or not?) into the
>>> method Phase#checkPreconditions of a new Phase subclass, but it wouldn't
>>> work. Actually if an AxisFault is thrown in Phase#checkPreconditions, all
>>> the following phases are skipped. Cf. AxisEngine#invoke.
>>>
>>> My next idea was to override Phase#invoke, insert my test and eventually
>>> delegate to the super method implementation. Unfortunately, Phase#invoke is
>>> marked as final. :(
>>>
>>> Then I tried to decorate a Phase in an handler implementation, but this
>>> is a dead end as well because a Phase instance is required by
>>> AxisConfigBuilder#getPhase.
>>>
>>> At this point, I ran out of ideas. That's why my asking for your help
>>> guys. I hope you will have a solution for my use case.
>>
>>
>> What is the problem of the security phase? I think you try to solve the
>> problem in wrong way.
>> Although security phase invoked for all the messages, it does not do any
>> thing if your service has not engaged security.
>>
>> One trick would be to add a new handler to Transport Phase and increase
>> the currentHanderIndex value of the message context.
>>
>> thanks,
>> Amila.
>>
>>>
>>>
>>> Thanks in advance.
>>>
>>> Alexis
>>>
>>>
>>
>>
>> --
>> Amila Suriarachchi
>> WSO2 Inc.
>> blog: http://amilachinthaka.blogspot.com/
>>
>
>
--
Amila Suriarachchi
WSO2 Inc.
blog: http://amilachinthaka.blogspot.com/
Re: how to skip a Phase?
Posted by Alexis Midon <mi...@intalio.com>.
thanks for proofreading.very much appreciated,
Alexis
On Mon, Aug 31, 2009 at 9:48 PM, Amila Suriarachchi <
amilasuriarachchi@gmail.com> wrote:
> should be ok
>
> msgContext.setProperty(MessageContext.REMOTE_ADDR,
> request.getRemoteAddr());
>
> it gets the remoteAddress of the httpServletRequest object.
>
> thanks,
> Amila.
>
>
> On Tue, Sep 1, 2009 at 12:56 AM, Alexis Midon <mi...@intalio.com> wrote:
>
>> Hi Deepal and Amila,
>> thank you guys for your answers. I concede that my use case might sound
>> strange and out of the standard path.
>> Anyway I implemented the following handler witch seems to work fine so
>> far. I post it here for the records and to ask confirmation from you that
>> the property MessageContext.REMOTE_ADDR is the right property to check.
>>
>> Thanks again for your help,
>>
>> Alexis
>>
>>
>> public class NoSecurityForLocalhostHandler extends AbstractHandler {
>>
>> private static final Log log =
>> LogFactory.getLog(NoSecurityForLocalhostHandler.class);
>>
>> List ips = new ArrayList();
>>
>> public NoSecurityForLocalhostHandler() throws SocketException {
>> Enumeration<NetworkInterface> e1 =
>> NetworkInterface.getNetworkInterfaces();
>> while (e1.hasMoreElements()) {
>> NetworkInterface ni = e1.nextElement();
>> Enumeration<InetAddress> e2 = ni.getInetAddresses();
>> while (e2.hasMoreElements()) {
>> InetAddress ia = e2.nextElement();
>> ips.add(ia.getHostAddress());
>> }
>> }
>> }
>>
>> public InvocationResponse invoke(MessageContext msgContext) throws
>> AxisFault {
>> log.debug("Check if Security phase should be skipped");
>> String remoteAddr = (String)
>> msgContext.getProperty(MessageContext.REMOTE_ADDR);
>> if (remoteAddr == null) {
>> log.debug("No REMOTE_ADDR in message context");
>> } else {
>> log.debug("REMOTE_ADDR is " + remoteAddr);
>> if (ips.contains(remoteAddr)) {
>> log.debug("Remote address matches a local address. The
>> Security phase will be removed (if any)");
>> for (int i = 0; i < msgContext.getExecutionChain().size();
>> i++) {
>> Phase phase = (Phase)
>> msgContext.getExecutionChain().get(i);
>> if ("Security".equalsIgnoreCase(phase.getName())) {
>> msgContext.getExecutionChain().remove(phase);
>> log.debug("Security phase actually removed");
>> break;
>> }
>> }
>> } else {
>> log.debug("Remote address is not local");
>> }
>> }
>> return InvocationResponse.CONTINUE;
>> }
>> }
>>
>>
>>
>> On Tue, Aug 25, 2009 at 9:45 PM, Amila Suriarachchi <
>> amilasuriarachchi@gmail.com> wrote:
>>
>>>
>>>
>>> On Tue, Aug 25, 2009 at 11:24 PM, Alexis Midon <mi...@intalio.com>wrote:
>>>
>>>> Hey there,
>>>>
>>>> I'm trying to dynamically skip a phase. Let me explain.
>>>> Let's say I have defined the following phases as InFlow: Transport,
>>>> Security, Dispatch, OperationInPhase. I want to skip the Security phase in
>>>> some cases, in other words I want the phase order to become [Transport,
>>>> Dispatch, OperationInPhase].
>>>>
>>>> I've tried to insert my decision test (skip Security or not?) into the
>>>> method Phase#checkPreconditions of a new Phase subclass, but it wouldn't
>>>> work. Actually if an AxisFault is thrown in Phase#checkPreconditions, all
>>>> the following phases are skipped. Cf. AxisEngine#invoke.
>>>>
>>>> My next idea was to override Phase#invoke, insert my test and eventually
>>>> delegate to the super method implementation. Unfortunately, Phase#invoke is
>>>> marked as final. :(
>>>>
>>>> Then I tried to decorate a Phase in an handler implementation, but this
>>>> is a dead end as well because a Phase instance is required by
>>>> AxisConfigBuilder#getPhase.
>>>>
>>>> At this point, I ran out of ideas. That's why my asking for your help
>>>> guys. I hope you will have a solution for my use case.
>>>
>>>
>>> What is the problem of the security phase? I think you try to solve the
>>> problem in wrong way.
>>> Although security phase invoked for all the messages, it does not do any
>>> thing if your service has not engaged security.
>>>
>>> One trick would be to add a new handler to Transport Phase and increase
>>> the currentHanderIndex value of the message context.
>>>
>>> thanks,
>>> Amila.
>>>
>>>>
>>>>
>>>> Thanks in advance.
>>>>
>>>> Alexis
>>>>
>>>>
>>>
>>>
>>> --
>>> Amila Suriarachchi
>>> WSO2 Inc.
>>> blog: http://amilachinthaka.blogspot.com/
>>>
>>
>>
>
>
> --
> Amila Suriarachchi
> WSO2 Inc.
> blog: http://amilachinthaka.blogspot.com/
>