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 <[email protected]> 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 < > [email protected]> wrote: > >> >> >> On Tue, Aug 25, 2009 at 11:24 PM, Alexis Midon <[email protected]> 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/
