美文网首页互联网技术IT交流圈JavaSpring cloud
Spring boot 过滤器、拦截器、监听器

Spring boot 过滤器、拦截器、监听器

作者: 胖嘟嘟洒酒疯 | 来源:发表于2019-01-21 15:44 被阅读48次

1. 过滤器

在HttpServletRequest 到达Servlet 之前,拦截客户的HttpServletRequest 。
根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和数据。
在HttpServletResponse 到达客户端之前,拦截HttpServletResponse 。
根据需要检查HttpServletResponse ,可以修改HttpServletResponse 头和数据
应用场景:
修改request和reponse、跨域、拦截请求
过滤器使用:
继承Filter

package com.example.demo.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.time.LocalDateTime;

public class ParamFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void destroy() {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("url:" + ((HttpServletRequest)servletRequest).getRequestURL() + " paramFilter time:" + LocalDateTime.now().toString());
        servletRequest.setAttribute("param", "param");
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

配置Filter

package com.example.demo.config;

import com.example.demo.filter.ParamFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {


    @Bean
    public FilterRegistrationBean regisFilter(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new ParamFilter());
        filterRegistrationBean.addUrlPatterns("/*");
        return filterRegistrationBean;
    }

}

2. 拦截器

拦截器类似于Servlet开发中的过滤器Filter,用于对处理器 进行预处理和后处理
应用场景:
日志记录、权限检查、性能检测
拦截器的使用:
继承HandlerInterceptor

package com.example.demo.interceptor;

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

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

public class ParamInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截到请求url:" + request.getRequestURL());
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

配置拦截器

package com.example.demo.config;

import com.example.demo.interceptor.ParamInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        InterceptorRegistration interceptorRegistration = registry.addInterceptor(new ParamInterceptor());
        interceptorRegistration.addPathPatterns("/*");
    }
}

Controller:

package com.example.demo.controller;


import com.example.demo.bean.Car;
import com.example.demo.bean.Cat;
import com.example.demo.model.Person;
import com.fasterxml.jackson.annotation.JacksonInject;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.PostConstruct;
import java.beans.PropertyEditorSupport;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

@RestController
public class DemoController {

    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }

    @GetMapping("/filter")
    public String filter(){
        return "filter";
    }

}

控制台输出结果:

url:http://localhost:8082/ paramFilter time:2019-01-21T15:26:29.335
拦截到请求url:http://localhost:8082/
拦截到请求url:http://localhost:8082/error
url:http://localhost:8082/hello paramFilter time:2019-01-21T15:26:46.916
拦截到请求url:http://localhost:8082/hello

过滤器与拦截器的异同:

  • Filter是依赖于Servlet容器,属于Servlet规范的一部分,而拦截器则是独立存在的,可以在任何情况下使用。
  • Filter的执行由Servlet容器回调完成,而拦截器通常通过动态代理的方式来执行。
  • Filter的生命周期由Servlet容器管理,而拦截器则可以通过IoC容器来管理,因此可以通过注入等方式来获取其他Bean的实例,因此使用会更方便。

3.监听器

eg.
ServletContextListener、HttpSessionListener
分别监听severletContext和httpSession的创建与销毁

相关文章

网友评论

    本文标题:Spring boot 过滤器、拦截器、监听器

    本文链接:https://www.haomeiwen.com/subject/xjucjqtx.html