在 Spring Boot 中配置 Servlet、过滤器和侦听器

x33g5p2x  于2022-09-29 转载在 Spring  
字(3.2k)|赞(0)|评价(0)|浏览(330)

在 Spring Boot 中,您可以使用 ServletRegistrationBean、FilterRegistrationBean 和 ServletListenerRegistrationBean bean 定义来注册 Servlet、Filters、Listeners。

例如,考虑以下 Servlet 示例:

package com.example;

import org.springframework.stereotype.Component;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Component
public class DemoServlet extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    resp.getWriter().write("called Servlet!");
  }
}

我们可以使用 ServletRegistrationBean 注册 DemoServlet 并将其映射到 URL 模式 /myServlet,如下例所示:

package com.example;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
  @Autowired private FilterServlet myServlet;

  @Bean
  public ServletRegistrationBean<DemoServlet> myServletBean() {
    ServletRegistrationBean<DemoServlet> servlet = new ServletRegistrationBean<>();
    servlet.setServlet(myServlet);
    servlet.addUrlMappings("/myServlet");
    return servlet;
  }
}

如果您尝试请求 http://localhost:8080/myServlet,您可以检查是否调用了 DemoServlet

called Servlet!

通过使用这种方法,您可以利用 Spring 对 servlet、过滤器和侦听器的依赖注入。

实现一个 Servlet 过滤器

为了为您的请求实现 Servlet 过滤器,您可以在 org.springframework.boot.web.servlet.FilterRegistrationBean 上注册过滤器。这允许选择将过滤器绑定到请求的 URL 模式。例如,当请求 URL 模式*/demo* 时,如何激活 doFilter 方法:

package com.example;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class RequestFilter implements Filter {
  @Bean
  public FilterRegistrationBean<RequestFilter> loggingFilter() {
    FilterRegistrationBean<RequestFilter> registrationBean = new FilterRegistrationBean<>();
    registrationBean.setFilter(new RequestFilter());
    registrationBean.addUrlPatterns("/demo");
    return registrationBean;
  }

  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;
    System.out.println("Called request " + req.getRequestURI());
    chain.doFilter(request, response);
    System.out.println("Response :" + res.getContentType());
  }
}

请注意,您也可以使用 @Component 而不是 @Bean 来注释此类,但在这种情况下,将为每个请求执行过滤器:

@Component
public class RequestFilter implements Filter {
  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;
    System.out.println("Called request " + req.getRequestURI());
    chain.doFilter(request, response);
    System.out.println("Response :" + res.getContentType());
  }
}

相关文章

微信公众号

最新文章

更多