Spring Boot注册servlet,filter,listener

因为项目需要,需要在Spring Boot项目里加载第三方jar包下的过滤器,以及配置自定义Servlet(额,好久没写过Servlet了),忙里偷闲,将这些东西整理一下。

注解的方式配置

Servlet 3.0 开始提供了这 3 个注解来代替。

@WebServlet => 代替 servlet 配置

@WebFilter => 代替 filter 配置

@WebListener => 代替 listener 配置

配置servlet

@WebServlet(name = "testServlet", urlPatterns = {"/testServlet"},
        initParams = {@WebInitParam(name = "param1", value = "this is param1"),
                @WebInitParam(name = "param2", value = "this is param2")})
public class TestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String param1 = getServletConfig().getInitParameter("param1");
        String param2 = getInitParameter("param2");
        System.out.println("param1=" + param1);
        System.out.println("param2=" + param2);
        System.out.println("---------TestServlet------------");
    }
}

如果要使servlet生效,还需要在启动类上加上@ServletComponentScan,不然可能会不生效。

@ServletComponentScan
@SpringBootApplication
public class TestApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }

}

配置filter

//@Component
@WebFilter(filterName = "testFilter", urlPatterns = {"/*"},
        initParams = {@WebInitParam(name = "param1", value = "this is param1"),
                @WebInitParam(name = "param2", value = "this is param2")})
public class TestFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        String param1 = filterConfig.getInitParameter("param1");
        String param2 = filterConfig.getInitParameter("param2");
        System.out.println("param1=" + param1);
        System.out.println("param2=" + param2);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("---------TestFilter------------");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

如果发现filter没有生效,可以考虑加上@Component注解(可能是因为版本问题吧,有的时候不需要加,加了反而会报错)。

配置listener

@WebListener
public class TestListener implements ServletContextListener {
    
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("---------------TestListener---------------");
    }
}

根据我的测试,此注解只对Web监听器起作用,例如ServletContextListener,HttpSessionListener,对于ApplicationListener需要使用@Component注解。

代码的方式配置

ServletRegistrationBean => 配置servlet
FilterRegistrationBean => 配置filter
ServletListenerRegistrationBean => 配置listener

配置servlet

@Configuration
public class Config {

    @Bean
    public ServletRegistrationBean testServlet() {
        //创建servlet注册bean
        ServletRegistrationBean<TestServlet> servletRegistrationBean = new ServletRegistrationBean<>();
        //创建servlet
        TestServlet testServlet = new TestServlet();
        //注入servlet
        servletRegistrationBean.setServlet(testServlet);
        //servlet名称
        servletRegistrationBean.setName("testServlet");
        //映射url
        servletRegistrationBean.addUrlMappings("/testServlet");
        //注入参数
        servletRegistrationBean.addInitParameter("param1", "this is param1");
        servletRegistrationBean.addInitParameter("param2", "this is param2");
        
        return servletRegistrationBean;
    }

}

配置filter

在Config类里添加如下方法:

@Bean
public FilterRegistrationBean testFilter() {
    //创建filter注册bean
    FilterRegistrationBean<TestFilter> filterFilterRegistrationBean = new FilterRegistrationBean<>();
    //创建filter
    TestFilter testFilter = new TestFilter();
    //注入filter
    filterFilterRegistrationBean.setFilter(testFilter);
    //filter名称
    filterFilterRegistrationBean.setName("testFilter");
    //拦截规则
    filterFilterRegistrationBean.addUrlPatterns("/*");
    //执行顺序
    filterFilterRegistrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
    //注入参数
    filterFilterRegistrationBean.addInitParameter("param3", "this is param3");
    filterFilterRegistrationBean.addInitParameter("param4", "this is param4");

    return filterFilterRegistrationBean;
}

配置listener

在Config类里添加如下方法:

@Bean
public ServletListenerRegistrationBean testListener() {
    //创建listener注册bean
    ServletListenerRegistrationBean<TestListener> servletListenerRegistrationBean = new ServletListenerRegistrationBean<>();
    //创建listener
    TestListener testListener = new TestListener();
    //注入listener
    servletListenerRegistrationBean.setListener(testListener);

    return servletListenerRegistrationBean;
}

动态的方式配置

如果你在 Spring Boot 中完成 Servlet、Filter、Listener 的初始化操作,需要在 Spring 中实现ServletContextInitializer 这个接口,并注册为一个 bean。

@Component
public class DynamicConfig implements ServletContextInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
             
	}
}

配置servlet

在onStartup方法中添加如下代码:

ServletRegistration.Dynamic testServlet = servletContext.addServlet("testServlet", TestServlet.class);
testServlet.addMapping("/testServlet");
testServlet.setInitParameter("param1", "this is param1");
testServlet.setInitParameter("param2", "this is param2");

配置filter

在onStartup方法中添加如下代码:

FilterRegistration.Dynamic testFilter = servletContext.addFilter("testFilter", TestFilter.class);
EnumSet<DispatcherType> enumSet = EnumSet.of(DispatcherType.REQUEST);
testFilter.addMappingForUrlPatterns(enumSet, true, "/*");
testFilter.setInitParameter("param3", "this is param3");
testFilter.setInitParameter("param4", "this is param4");

配置listener

在onStartup方法中添加如下代码:

servletContext.addListener(TestListener.class);

总结

这就是整理的在Spring Boot中注册servlet,filter,listener的三种方式,在此做下笔记,希望能对自己和大家有帮助!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值