1

I want to add filter which adds new parameter into header of each request on the WebSphere. I found Global Filter for all Web Applications and Configuring global filter in websphere 8.5 and I tried to create global context listener which adds a filter. However, all my attempts end with exception which says that I cannot add filter from programmatically added listener.

[9/21/15 9:39:29:646 CEST] 00000000 ContainerHelp E   WSVR0501E: Error creating component com.ibm.ws.runtime.component.CompositionUnitMgrImpl@a344950a
com.ibm.ws.exception.RuntimeWarning: com.ibm.ws.webcontainer.exception.WebAppNotLoadedException: Failed to load webapp: Failed to load webapp: SRVE8011E: This operation cannot be executed from a programmatically added listener.
    at com.ibm.ws.webcontainer.component.WebContainerImpl.install(WebContainerImpl.java:428)
    at com.ibm.ws.webcontainer.component.WebContainerImpl.start(WebContainerImpl.java:714)
    at com.ibm.ws.runtime.component.ApplicationMgrImpl.start(ApplicationMgrImpl.java:1165)
    at com.ibm.ws.runtime.component.DeployedApplicationImpl.fireDeployedObjectStart(DeployedApplicationImpl.java:1369)
    at com.ibm.ws.runtime.component.DeployedModuleImpl.start(DeployedModuleImpl.java:639)
    at com.ibm.ws.runtime.component.DeployedApplicationImpl.start(DeployedApplicationImpl.java:967)
    at com.ibm.ws.runtime.component.ApplicationMgrImpl.startApplication(ApplicationMgrImpl.java:771)
    at com.ibm.ws.runtime.component.CompositionUnitMgrImpl$CUInitializer$1.run(CompositionUnitMgrImpl.java:945)
    at com.ibm.ws.security.auth.ContextManagerImpl.runAs(ContextManagerImpl.java:5468)
    at com.ibm.ws.security.auth.ContextManagerImpl.runAsSystem(ContextManagerImpl.java:5594)
    at com.ibm.ws.security.core.SecurityContext.runAsSystem(SecurityContext.java:255)
    at com.ibm.ws.runtime.component.CompositionUnitMgrImpl$CUInitializer.run(CompositionUnitMgrImpl.java:950)
    at com.ibm.wsspi.runtime.component.WsComponentImpl$_AsynchInitializer.run(WsComponentImpl.java:496)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1702)

Listener class:

@WebListener
public class RequestListener implements ServletContextListener {    

    @Override
    public void contextInitialized(ServletContextEvent sce) {           
        ServletContext context = sce.getServletContext();
        try {
            SimpleFilter f = context.createFilter(SimpleFilter.class);  
            FilterRegistration fr = context.addFilter("simpleFilter", f);
            fr.addMappingForUrlPatterns(null, false, "/*");             
        } catch (IllegalStateException e) {
            System.out.println("Filter was not added: " + e.getMessage());
            e.printStackTrace();
        } catch (ServletException e) {
            e.printStackTrace();
        }
    }     
}

Filter class:

public class SimpleFilter implements Filter { 


    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
            FilterChain filterChain) throws IOException, ServletException {             
        HttpServletResponse httpServletResponse = (HttpServletResponse)servletResponse;        
        httpServletResponse.setHeader("Via", ServerName.getDisplayName());
        filterChain.doFilter(servletRequest, httpServletResponse);         
    }    
}

Is there any way to make it work?

Thanks

Community
  • 1
  • 1
Jan Pichl
  • 11
  • 2
  • I believe you need a ServletContainerInitializer to call createFilter. Have you tried this? – Alasdair Sep 21 '15 at 22:29
  • I tried this but I could not get this working either. I found a way using ExtendedServletContext and IFilterConfig. Unfortunately, it seems deprecated according to the [documentation](http://www-01.ibm.com/support/knowledgecenter/SS7K4U_8.5.5/com.ibm.websphere.javadoc.liberty.doc/com.ibm.websphere.appserver.spi.servlet_1.1-javadoc/com/ibm/websphere/servlet/filter/IFilterConfig.html) – Jan Pichl Sep 26 '15 at 12:07

0 Answers0