Sprinboot打包成jar包运行似乎没有什么问题,但是当需求让你不得不将Springboot项目打包成war扔到Tomcat中运行时,就需要注意以下问题:
1.Springboot内置的Tomcat中的Filter类与外部Tomcat中的Filter类写法不一致:
Springboot中内置Tomcat的Filter中init(), destroy()为默认方法继承后可以不重写这两个方法。
外部Tomcat中的Filter的init(), destroy()是抽象方法,你必须实现这两个方法,否则启动会报错。
解决:你的过滤器继承Filter类后要将init(), doFilter(), destroy()全部重写。
2. 通过@WebFilter声明的过滤器无法注入其他Spring组件(对象为null):
原因还未了解
解决:去掉@WebFilter和其他所有注解,通过配置类来手动创建Filter Bean
package com.guncorpse.skeleton.base.config;
import javax.servlet.Filter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.DelegatingFilterProxy;
import com.guncorpse.skeleton.base.filter.BaseSecurityFilter;
@Configuration
public class FilterConfig {
@Bean
public Filter baseSecurityFilter(){
return new BaseSecurityFilter();
}
@Bean
public FilterRegistrationBean<DelegatingFilterProxy> baseSecurityFilterRegistration() {
FilterRegistrationBean<DelegatingFilterProxy> registration = new FilterRegistrationBean<DelegatingFilterProxy>();
registration.setFilter(new DelegatingFilterProxy("baseSecurityFilter"));
registration.addUrlPatterns("/*");
registration.setName("baseSecurityFilter");
registration.setOrder(1);
return registration;
}
}