Spring Boot - Servlet、过滤器、监听器、拦截器

Spring Boot - Servlet、过滤器、监听器、拦截器

上一篇,咱们讲解了spring boot(json,jsp,freemarker)配置及整合方法,不清楚的能够点击了解java

Servlet的两种实现方式

  • 经过@Bean手动注入
    实现一个返回ServletRegistrationBean的方法,并将该对象注册到spring中。这段代码须要放到spring boot自动扫描的目录中,建议放到@Configuration标识的类中,进行统一管理
@Bean
    public ServletRegistrationBean servletRegistrationBean() {
        return new ServletRegistrationBean(new HelloServlet(),"/xiaohong");
    }
  • 经过@WebServlet自动注入web

    • 增长注解@ServletComponentScan,开启servlet扫描
    • 增长注解@WebServlet,标识该类是servlet,并声明urlPath
@ServletComponentScan
@SpringBootApplication
public class Start {……}
@WebServlet("/xiaohong")
public class HelloServlet extends HttpServlet {……}
  • 示例:HelloServlet.java
package com.wanye.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * Created by wanye on 2017/5/24.
 */
@WebServlet("/xiaohong")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println(">>do get<<");
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println(">>do post<<");
        PrintWriter out = resp.getWriter();
        out.print("hello @xiaohong");
        out.close();
    }
}

过滤器Filter和监听器Listener

过滤器Filter和监听器Listener的实现方式与Servlet实现方式同样,这里列出来区别,你们本身能够尝试一下。spring

  1. 经过@Bean手动注入json

    1. Filter须要实现返回FilterRegistrationBean的方法
    2. Listener须要实现返回ServletListenerRegistrationBean的方法
  2. 经过注解自动注入segmentfault

    1. Filter须要增长注解@WebFilter,标识该类是Filter
    2. Listener须要增长注解@WebListener,标识该类是Listener

拦截器

上面讲解了Servlet、过滤器、监听器,细心的同窗能够发现,他们都是属于javax.servlet所提供的Api。jsp

拦截器原理

简单来说是经过动态代理实现,被访问的目标方法经过代理类(方法)来执行,这样咱们就能够在真正要执行的方法执行前、后作一些处理;经过拦截器这种方式,使得代码能够进行更高度的抽象。更多拦截器、动态代理的内容,请你们查阅资料了解。ide

HTTP拦截器

在Spring中实现Http拦截器post

  1. 建立拦截器类并实现 HandlerInterceptor接口,perHandler返回true表示经过拦截
package com.wanye.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Created by wanye on 2017/5/24.
 */
public class HelloInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println(">>interceptor preHandle<<");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println(">>interceptor postHandle请求处理以后进行调用,可是在视图被渲染以前(Controller方法调用以后)<<");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println(">>interceptor afterCompletion<<");
    }
}
  1. 建立一个Java类继承WebMvcConfigurerAdapter,并重写 addInterceptors 方法,@Configuration
package com.wanye.interceptor;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**
 * Created by wanye on 2017/5/24.
 */
@Configuration
public class HelloConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new HelloInterceptor()).addPathPatterns("/**");

    }
}
  1. 实例化拦截器,而后将对像手动添加到拦截器链中(在addInterceptors方法中添加)

总结

本文讲解了注册Servlet/Filter/Listener的两种⽅方式(Servlet/Filter/Listener的概念你们自行查阅资料了解),及拦截器基本原理,并经过注解实现http拦截器,另外本文还有一个疑问:为何Spring中实现的Http拦截器,没法对咱们自定义的servlet请求进行拦截?欢迎你们留言讨论。学习

注解含义

  1. @Bean // @Bean明确地指示了产⽣⼀一个bean的方法,而且交给Spring容器管理
  2. @ServletComponentScan // 当使用@ServletComponentScan扫描Servlet组件时,Servlet、过滤器和监听器能够是经过@WebServlet、@WebFilter和@WebListener自动注册
  3. @WebServlet(“/hello")@WebFilter@WebListener // 分别标识

最后

若本文对你有帮助,望点赞。为了提升你们学习效果,录制了同步的视频课程,还望你们支持视频课程url

相关文章
相关标签/搜索