无法在 web.xml 中加载用户定义的过滤器:com.xxx.CORSFilter [英] Could not load user defined filter in web.xml: com.xxx.CORSFilter

查看:25
本文介绍了无法在 web.xml 中加载用户定义的过滤器:com.xxx.CORSFilter的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个在 WebLogic Server 上运行的 SpringBoot 应用程序版本:12.2.1.3.0当我定义自定义 servlet 过滤器时,它在嵌入式 Tomcat 上工作正常.但是,当我将我的应用程序作为 war 文件部署到 wlserver 时,它会在每次请求后引发以下错误.我在这里缺少什么?

I have a SpringBoot application running on WebLogic Server Version: 12.2.1.3.0 When I define a custom servlet Filter its working fine on Embedded Tomcat. However, when i deploy my application as a war file to wlserver it throws following error after each request. What am i missing here?

    <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 文件的内容

This is the content of my web.xml file

<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_3_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>

我正在设置 servlet 依赖项以防止 jar 冲突.

I am setting servlet dependency as provided to prevent jar conflicts.

        <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 文件中的过滤器定义并将我的过滤器注册为 bean 配置,因为这是一个 SpringBoot 应用程序.我还从过滤器中删除了 @Component 和 @Order 注释.但结果和上面一样.它仍在 Tomcat 上工作,但不在 Weblogic 上.这是过滤器配置 bean 的代码.

As a solution i tried to remove the filter definitions in web.xml file and registered my filter as a bean configuration since this is a SpringBoot application. I also removed @Component and @Order annotations from my filter. But the result was the same as above. It is still working on Tomcat but not in Weblogic. Here is the code for filter config bean.

@Configuration
public class Filters {

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

推荐答案

您的 weblogic 提供的 servlet api 可能是旧版本,您的过滤器类需要覆盖 init 方法.

Your servlet api provided by weblogic is probably old version and your filter class needs to override init method.

在您的过滤器类中添加以下代码;

Add below code at your filter class;

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

在新版本的 servlet api 中,过滤器类具有默认的空 init 方法.

At new versions of servlet api, filter class has default empty init method.

这篇关于无法在 web.xml 中加载用户定义的过滤器:com.xxx.CORSFilter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆