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的创建与销毁