前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot 中使用自定义的 Servlet, Filter, Listener

SpringBoot 中使用自定义的 Servlet, Filter, Listener

作者头像
北漂的我
发布2019-05-28 12:39:43
8410
发布2019-05-28 12:39:43
举报
文章被收录于专栏:北漂的我北漂的我

SpringBoot 中使用自定义的 Servlet, Filter, Listener 有两种方式

1. 使用 @ServletComponentScan 定义要扫描的包目录, Servlet, Filter, Listener 可以通过 @WebServlet, @WebListener, @WebFilter 进行自动注册.

代码语言:javascript
复制
@Controller
@SpringBootApplication
@ComponentScan(basePackages={"com.codingos.demo","com.codingos.springbootlession1"})
@ServletComponentScan(basePackages="com.codingos.springbootlession1.demo")
public class SpringBootLession1Application {
    public static void main(String[] args) {
		SpringApplication.run(SpringBootLession1Application.class, args);
	}
}
代码语言:javascript
复制
@WebServlet(name="servletDemo", urlPatterns="/servletDemo", initParams= {@WebInitParam(name="myname",value="myvalue")})
public class ServletDemo extends HttpServlet {

@WebFilter(servletNames="servletDemo")
public class FilterDemo extends OncePerRequestFilter {

@WebListener
public class RequestListenerDemo implements ServletRequestListener {

2. 自定义一些 Servlet, Filter, Listener, 然后在 Application 类中使用 @Bean 进行注册

代码语言:javascript
复制
package com.codingos.springbootlession1;

import java.util.EventListener;
import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.codingos.springbootlession1.demo.FilterDemo2;
import com.codingos.springbootlession1.demo.RequestListenerDemo2;
import com.codingos.springbootlession1.demo.ServletDemo2;

@Controller
@SpringBootApplication
@ComponentScan(basePackages={"com.codingos.demo","com.codingos.springbootlession1"})
@ServletComponentScan(basePackages="com.codingos.springbootlession1.demo")
public class SpringBootLession1Application {
	
	@Autowired
	private StringRedisTemplate template;
	

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

	@Bean
	public static ServletRegistrationBean servletRegistrationBean() {
		ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();
		servletRegistrationBean.setServlet(new ServletDemo2());
		servletRegistrationBean.setName("servletDemo2");
		servletRegistrationBean.addUrlMappings("/spring-boot/servletDemo2");
		servletRegistrationBean.addInitParameter("myname", "myvalue");
		return servletRegistrationBean;
	}
	
	@Bean
	public static FilterRegistrationBean filterRegistrationBean() {
		FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
		filterRegistrationBean.setFilter(new FilterDemo2());
		filterRegistrationBean.addServletNames("servletDemo2");
		return filterRegistrationBean;
	}
	
	@Bean
	public static ServletListenerRegistrationBean<EventListener> ServletListenerRegistrationBean() {
		ServletListenerRegistrationBean<EventListener> servletListenerRegistrationBean = new ServletListenerRegistrationBean<>();
		servletListenerRegistrationBean.setListener(new RequestListenerDemo2());
		return servletListenerRegistrationBean;
	}
}
代码语言:javascript
复制
package com.codingos.springbootlession1.demo;

import java.io.IOException;
import java.io.Writer;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo2 extends HttpServlet {

	private static final long serialVersionUID = 4982760566703313419L;
	
	private String value;

	@Override
	public void init(ServletConfig config) throws ServletException {
		value = config.getInitParameter("myname");
		super.init(config);
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		Writer writer = resp.getWriter();
		req.getServletContext().log("ServletDemo2 doGet");
		writer.write("<html><body>ServletDemo2 AAAAAAA "+ value +"</body></html>");
		//super.doGet(req, resp);
	}
}
代码语言:javascript
复制
package com.codingos.springbootlession1.demo;

import java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.filter.OncePerRequestFilter;

public class FilterDemo2 extends OncePerRequestFilter {

	@Override
	protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
			throws ServletException, IOException {
		ServletContext servletContext = request.getServletContext();
		servletContext = getServletContext();
//		servletContext.log("servletDemo2 was filtered");
		servletContext.log(request.getRequestURI() + "servletDemo2 was filtered");
		filterChain.doFilter(request, response);
	}

}
代码语言:javascript
复制
package com.codingos.springbootlession1.demo;

import javax.servlet.ServletContext;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;

public class RequestListenerDemo2 implements ServletRequestListener {


	@Override
	public void requestInitialized(ServletRequestEvent sre) {
//		HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();
//		ServletContext servletContext = request.getServletContext();
		ServletContext servletContext = sre.getServletContext();
		servletContext.log("************ RequestListenerDemo2 requestInitialized ******");

	}
	
	@Override
	public void requestDestroyed(ServletRequestEvent sre) {
		ServletContext servletContext = sre.getServletContext();
		servletContext.log("************ RequestListenerDemo2 requestDestroyed ******");
	}

}

Filter 链的执行顺序

Filter1 开始 Filter2 开始 Filter3 开始 执行业务逻辑........................ Filter3 结束 Filter2 结束 Filter1 结束

在SpringBoot中, Filter 的执行顺序就是由Filter的类名决定的. 在SpringMvc中是由 web.xml 中 mapping 的先后顺序决定的. Filter的实例化顺序是倒序.

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档