在Spring Boot中,当需要以注解的方式添加session监听器或其他servlet(包括监听器、过滤器、以及自定义的servlet)时,为了让其生效,还需要在配置类上添加@ServletComponentScan
注解,该注解的作用是告诉spring boot,让其自动管理servlet,否则注解方式注册的servlet不起作用
- 定义过滤器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| import org.slf4j.Logger; import org.slf4j.LoggerFactory;
import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException;
@WebFilter(filterName = "myFilter", urlPatterns = "/*") public class MyFilter implements Filter { private Logger logger = LoggerFactory.getLogger(MyFilter.class);
@Override public void init(FilterConfig filterConfig) throws ServletException { logger.info("过滤器:myFilter >>>> 初始化"); }
@Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { logger.info("过滤器:myFilter >>>> 执行过滤操作"); filterChain.doFilter(servletRequest, servletResponse); }
@Override public void destroy() { logger.info("过滤器:myFilter >>>> 销毁"); } }
|
- 定义监听器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| import org.slf4j.Logger; import org.slf4j.LoggerFactory;
import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener;
@WebListener public class MyHttpSessionListener implements HttpSessionListener { private Logger logger = LoggerFactory.getLogger(MyHttpSessionListener.class);
@Override public void sessionCreated(HttpSessionEvent httpSessionEvent) { logger.info("监听器:Session >>>> 创建"); }
@Override public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { logger.info("监听器:Session >>>> 销毁"); } }
|
- 自定义servlet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| import org.slf4j.Logger; import org.slf4j.LoggerFactory;
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter;
public class MyServlet1 extends HttpServlet { private Logger logger = LoggerFactory.getLogger(MyServlet1.class);
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { logger.info("已执行:MyServlet1.doGet()"); doPost(req, resp); }
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { logger.info("已执行:MyServlet1.doPost()"); resp.setContentType("text/html"); resp.setCharacterEncoding("UTF-8");
PrintWriter out = resp.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Hello World</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>这是:MyServlet1</h1>"); out.println("</body>"); out.println("</html>"); } }
|
配置@ServletComponentScan
以使以上servlet生效
1 2 3 4 5 6 7 8 9 10 11 12 13
| @SpringBootApplication @ServletComponentScan public class BasicApp extends WebMvcConfigurerAdapter{
@Bean public ServletRegistrationBean myServlet1() { return new ServletRegistrationBean(new MyServlet1(),"/myServlet1/*"); }
public static void main(String[] args) { SpringApplication.run(BasicApp.class, args); } }
|