项目场景
idea + ssm整合 + maven + tomcat8.x + web3.x + JDK1.8 + 登录拦截器完成 , 跨域过滤器完成并测试
问题描述
报错内容 :
严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.StandardContext.filterStart 启动过滤器异常
java.lang.AbstractMethodError //抽象方法错误
at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:281)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:262)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:106)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4538)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5181)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
....
报错截图 :
原因分析
报错提示 : filterStart 启动过滤器异常
可能原因 :
- 过滤器内编写代码有问题
- 版本兼容问题
解决方案
修改过滤器代码 (未解决)
过滤器代码本身没有问题
版本兼容问题 (已解决)
查找资料后怀疑是版本兼容问题 , 请教过大佬后重写过滤器的init方法 , 问题解决
代码演示 :
//原本没有重写init方法 , 因为init方法是default修饰的 , 应该是不需要重写的 , 所以怀疑是版本兼容性问题
@WebFilter("/*")//拦截所有请求
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String origin = request.getHeader("Origin");
System.out.println("过滤器");
// 响应标头指定 指定可以访问资源的URI路径
response.setHeader("Access-Control-Allow-Origin", origin);
//响应标头指定响应访问所述资源到时允许的一种或多种方法
response.setHeader("Access-Control-Allow-Methods", "*");
//设置 受支持请求标头
response.setHeader("Access-Control-Allow-Headers", "*");
// 指示的请求的响应是否可以暴露于该页面。当true值返回时它可以被暴露
response.setHeader("Access-Control-Allow-Credentials", "true");
filterChain.doFilter(servletRequest, servletResponse);
}
}
总结
版本兼容性问题仍需要注意 , 下次在添加依赖和导包之前需要好好了解一下兼容性问题 , 虽然这次只出现在了一个ssm整合的项目中 , 保不齐下次就出现在了springboot中