1. 過濾器
在HttpServletRequest 到達(dá)Servlet 之前,攔截客戶的HttpServletRequest 。
根據(jù)需要檢查HttpServletRequest ,也可以修改HttpServletRequest 頭和數(shù)據(jù)。
在HttpServletResponse 到達(dá)客戶端之前,攔截HttpServletResponse 。
根據(jù)需要檢查HttpServletResponse ,可以修改HttpServletResponse 頭和數(shù)據(jù)
應(yīng)用場景:
修改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開發(fā)中的過濾器Filter,用于對處理器 進(jìn)行預(yù)處理和后處理
應(yīng)用場景:
日志記錄、權(quán)限檢查、性能檢測
攔截器的使用:
繼承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";
}
}
控制臺輸出結(jié)果:
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規(guī)范的一部分,而攔截器則是獨立存在的,可以在任何情況下使用。
- Filter的執(zhí)行由Servlet容器回調(diào)完成,而攔截器通常通過動態(tài)代理的方式來執(zhí)行。
- Filter的生命周期由Servlet容器管理,而攔截器則可以通過IoC容器來管理,因此可以通過注入等方式來獲取其他Bean的實例,因此使用會更方便。
3.監(jiān)聽器
eg.
ServletContextListener、HttpSessionListener
分別監(jiān)聽severletContext和httpSession的創(chuàng)建與銷毀