Не удалось загрузить пользовательский фильтр в web.xml: com.xxx.CORSFilter

У меня есть приложение SpringBoot, работающее на сервере WebLogic. Версия: 12.2.1.3.0 Когда я определяю пользовательский фильтр сервлета, он отлично работает на встроенном Tomcat. Однако, когда я развертываю свое приложение в качестве файла войны на wlserver, оно выдает следующую ошибку после каждого запроса. Что мне здесь не хватает?

    <Could not load user defined filter in web.xml: com.thy.bwsadmin.CORSFilter.
java.lang.AbstractMethodError
    at weblogic.servlet.internal.FilterManager$FilterInitAction.run(FilterManager.java:400)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:328)
    at weblogic.security.service.SecurityManager.runAsForUserCode(SecurityManager.java:197)
    at weblogic.servlet.provider.WlsSecurityProvider.runAsForUserCode(WlsSecurityProvider.java:203)
    at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:71)
    at weblogic.servlet.internal.FilterManager.initFilter(FilterManager.java:130)
    at weblogic.servlet.internal.FilterManager.loadFilter(FilterManager.java:92)
    at weblogic.servlet.internal.FilterManager.preloadFilters(FilterManager.java:72)
    at weblogic.servlet.internal.WebAppServletContext.preloadResources(WebAppServletContext.java:1928)
    at weblogic.servlet.internal.WebAppServletContext.start(WebAppServletContext.java:3106)
    at weblogic.servlet.internal.WebAppModule.startContexts(WebAppModule.java:1843)
    at weblogic.servlet.internal.WebAppModule.start(WebAppModule.java:884)
    at weblogic.application.internal.ExtensibleModuleWrapper$StartStateChange.next(ExtensibleModuleWrapper.java:360)
    at weblogic.application.internal.ExtensibleModuleWrapper$StartStateChange.next(ExtensibleModuleWrapper.java:356)
    at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:45)
    at weblogic.application.internal.ExtensibleModuleWrapper.start(ExtensibleModuleWrapper.java:138)
    at weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:124)
    at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:233)
    at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:228)
    at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:45)
    at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:78)
    at weblogic.application.internal.flow.StartModulesFlow.activate(StartModulesFlow.java:52)
    at weblogic.application.internal.BaseDeployment$2.next(BaseDeployment.java:752)
    at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:45)
    at weblogic.application.internal.BaseDeployment.activate(BaseDeployment.java:262)

Это содержимое моего файла web.xml

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
          http://java.sun.com/xml/ns/javaee/web-app
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <scope>provided</scope>
        </dependency>
0.xsd" version="3.0"> <display-name>MWSAdminService</display-name> <filter> <filter-name>CORSFilter</filter-name> <filter-class>com.sample.CORSFilter</filter-class> </filter> <filter-mapping> <filter-name>CORSFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>

Я устанавливаю зависимость сервлета, как предусмотрено, для предотвращения конфликтов jar.

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <scope>provided</scope>
        </dependency>

Это мой класс фильтра.

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import com.thy.bwsadmin.service.SecurityUserService;

    @Component
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public class CORSFilter implements Filter {



        @Autowired
        SecurityUserService securityUserService;

        @Override
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
                throws IOException, ServletException {

            HttpServletResponse response = (HttpServletResponse) res;
            HttpServletRequest request = (HttpServletRequest) req;

            boolean isAuthenticated = authenticateUser(request.getHeader("identity_no"), request.getRequestURI());


            if (isAuthenticated) {
                if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
                    response.setStatus(HttpServletResponse.SC_OK);
                } else {
                    chain.doFilter(req, res);
                }
            } else {
                response.sendError(HttpServletResponse.SC_OK, "401");
            }

        }

        private boolean authenticateUser(String userId, String requestURI) {
            if (Util.isNotEmpty(userId) 
            &&  securityUserService.isAuthorizedForEndpoint(userId.trim(), requestURI)) {
                return true;
            }else{
                return false;
            }

        }

    }

В качестве решения я попытался удалить определения фильтров в файле web.xml и зарегистрировал свой фильтр как конфигурацию компонента, поскольку это приложение SpringBoot. Я также удалил аннотации @Component и @Order из своего фильтра. Но результат был тот же, что и выше. Он все еще работает на Tomcat, но не в Weblogic. Вот код компонента конфигурации фильтра.

@Configuration
public class Filters {

    @Bean
    public FilterRegistrationBean<CORSFilter> loggingFilter() {
        FilterRegistrationBean<CORSFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new CORSFilter());
        registrationBean.addUrlPatterns("/*");
        return registrationBean;
    }
}

person mrgenco    schedule 16.07.2019    source источник
comment
Как создать военный файл?... Не могли бы вы поделиться классом приложений Springboot?   -  person Prasobh.Kollattu    schedule 29.07.2019


Ответы (1)


Ваш API-интерфейс сервлета, предоставленный weblogic, вероятно, является старой версией, и ваш класс фильтра должен переопределить метод инициализации.

Добавьте приведенный ниже код в свой класс фильтра;

@Override
public void init(FilterConfig filterConfig) throws ServletException {}; 

В новых версиях API сервлета класс фильтра по умолчанию имеет пустой метод инициализации.

person Jman    schedule 29.07.2019
comment
Добавление метода init в мой класс фильтра устранило проблему. Большое спасибо! - person mrgenco; 29.07.2019