原生servlet内容

HeJin大约 1 分钟Spring全家桶SpringBoot精讲细讲

由于SpringBoot基于sevlet3.0+,内嵌Tomcat容器。因此,无法像之前一样通过web.xml中配置Filter。

实现原生servlet接口

原生servlet

@WebServlet("/user")
public class UserServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       resp.getWriter().write("UserServlet");
       resp.getWriter().flush();
    }
}

原生filter

@WebFilter("/*")
public class LoginFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        request.getSession();
        
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        System.out.println("进入了LoginFilter");
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

原生listener

@WebListener
public class SessionListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("sessionCreated.....");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {

    }
}

主启动类开启原生servlet支持

@ServletComponentScan
@SpringBootApplication
public class Springboot01Application {

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

}

使用SpringBoot配置类(推荐使用)

filter

public class LoginFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        request.getSession();

        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        System.out.println("进入了LoginFilter");
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

servlet

public class UserServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       resp.getWriter().write("哔哩哔哩");
       resp.getWriter().flush();
    }
}

listener

public class SessionListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("sessionCreated.....");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {

    }
}

这时候主启动类不用@ServletComponentScan注解,在config配置类中配置这些。

@Configuration
public class ServletConfig {

    @Bean
    public ServletRegistrationBean<UserServlet> servletRegistrationBean(){
        ServletRegistrationBean<UserServlet> registrationBean = new ServletRegistrationBean<>();
        registrationBean.setServlet(new UserServlet());
        registrationBean.addUrlMappings("/user");

        return registrationBean;
    }

    @Bean
    public FilterRegistrationBean<LoginFilter> filterFilterRegistrationBean(){
        FilterRegistrationBean<LoginFilter> filter = new FilterRegistrationBean<>();
        filter.setFilter(new LoginFilter());
        filter.setUrlPatterns(Arrays.asList("/user/*", "/api/*"));

        return filter;
    }

    @Bean
    public ServletListenerRegistrationBean<SessionListener> listenerRegistrationBean(){
        ServletListenerRegistrationBean<SessionListener> listener = new ServletListenerRegistrationBean<>();
        listener.setListener(new SessionListener());

        return listener;
    }

}