Spring项目中的拦截器和注册器
拦截器作用与使用方法
参考:Springboot下自定义与注册拦截器 https://www.cnblogs.com/liangf27/p/10466996.html
拦截器的作用是什么?一般什么场景使用?
拦截器的作用是在请求发送到服务器或响应返回到客户端之前,对请求或响应进行拦截和处理。拦截器可以对请求进行预处理,如添加请求头、验证请求参数等;也可以对响应进行处理,如添加响应头、对响应数据进行加工等。
拦截器一般用于以下场景:
1. 权限验证:在请求到达服务器之前,对用户的身份进行验证,判断用户是否有权限访问该资源。
2. 日志记录:记录请求的详细信息,如请求的URL、请求参数、请求时间等,方便后续的调试和分析。
3. 缓存处理:在请求到达服务器之前,检查缓存中是否已经存在该请求的响应结果,如果存在则直接返回缓存结果,减少服务器的压力。
4. 统一处理:对请求进行统一处理,如添加请求头、对请求参数进行加工等,避免重复的代码。
5. 异常处理:对请求和响应进行异常处理,如捕获异常、记录异常信息等,保证系统的稳定性和可靠性。
spring中拦截器的原理是什么?怎么实现的
Spring中的拦截器是基于AOP(面向切面编程)实现的。具体来说,Spring MVC中的拦截器是通过实现HandlerInterceptor接口定义的,该接口定义了三个方法:
1. preHandle:在请求处理之前进行调用,返回值为boolean类型,如果返回false,则请求中断,不会继续向下执行。
2. postHandle:在请求处理之后进行调用,但是在视图被渲染之前,即Controller方法调用之后。
3. afterCompletion:在整个请求处理完成后进行调用,即在视图渲染完毕之后。
SpringMVC中的拦截器定义后需要通过WebMvcConfigurer进行注册,并且可以指定拦截器的拦截路径。
在请求到达DispatcherServlet之后,会根据请求的URL和HandlerMapping进行匹配,找到对应的Controller方法。在执行Controller方法之前,会先执行拦截器的preHandle方法,如果返回false,则请求中断,不会继续执行。在Controller方法执行完毕之后,会执行拦截器的postHandle方法和afterCompletion方法。
总的来说,Spring中的拦截器是通过AOP实现的,通过拦截器可以对请求进行预处理和后处理,实现了请求的统一处理和异常处理等功能。
实例如下:
/***
* 性能监控拦截器
*/
@Component
@Log4j2
public class StopWatchInterceptor extends HandlerInterceptorAdapter {
private NamedThreadLocal<Long> startTimeThreadLocal = new NamedThreadLocal<Long>("StopWatch-StartTime");
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
long beginTime = System.currentTimeMillis();
startTimeThreadLocal.set(beginTime);
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
long endTime = System.currentTimeMillis();
long beginTime = startTimeThreadLocal.get();
long consumeTime = endTime - beginTime;
if (consumeTime > 700) {
log.warn("slow api consume total {} millis,method {} uri{} params {},headers {}", consumeTime, request.getMethod(), request.getRequestURI(), request.getParameterMap(), getHeadersInfo(request));
}
startTimeThreadLocal.remove();
}
private Map<String, String> getHeadersInfo(HttpServletRequest request) {
Map<String, String> map = new HashMap<String, String>(16);
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String key = (String) headerNames.nextElement();
String value = request.getHeader(key);
map.put(key, value);
}
return map;
}
}
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Autowired
private StopWatchInterceptor stopWatchInterceptor;
/**
* 拦截器注册,并指定拦截的路径
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(stopWatchInterceptor).addPathPatterns("/**");
}
}
spring过滤器的作用是什么?一般什么场景使用?
过滤器的作用是在请求到达服务器之前或响应返回到客户端之前,对请求或响应进行过滤和处理。过滤器可以对请求进行过滤,如对请求参数进行验证、对请求进行编码等;也可以对响应进行过滤,如对响应数据进行加工、对响应进行压缩等。
过滤器一般用于以下场景:
1. 字符编码:对请求进行编码,防止出现乱码。
2. 参数验证:对请求参数进行验证,判断参数是否合法。
3. 安全控制:对请求进行安全控制,如防止SQL注入、XSS攻击等。
4. 日志记录:记录请求的详细信息,如请求的URL、请求参数、请求时间等,方便后续的调试和分析。
5. 压缩处理:对响应进行压缩,减少网络传输的数据量,提高响应速度。
6. 统一处理:对请求进行统一处理,如添加请求头、对请求参数进行加工等,避免重复的代码。
7. 异常处理:对请求和响应进行异常处理,如捕获异常、记录异常信息等,保证系统的稳定性和可靠性。
总的来说,过滤器可以对请求和响应进行过滤和处理,实现了请求的统一处理和异常处理等功能,提高了系统的可靠性和安全性。
spring中过滤器的原理是什么?怎么实现的
Spring中的过滤器是基于Servlet规范实现的。具体来说,Spring中的过滤器是通过Filter接口实现的,该接口定义了三个方法:
1. init:在过滤器被初始化时调用,可以在该方法中进行一些初始化操作。
2. doFilter:在请求被处理之前和响应被发送之前调用,可以在该方法中对请求和响应进行过滤和处理。
3. destroy:在过滤器被销毁时调用,可以在该方法中进行一些清理操作。
过滤器的定义
public class RepalceStreamFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest req = new WrapperHttpServletRequest((HttpServletRequest) servletRequest); filterChain.doFilter(req,servletResponse); } @Override public void destroy() { } }
过滤器的注册
@Configuration public class FilterConfig { @Bean public FilterRegistrationBean registrationBean() { FilterRegistrationBean regist = new FilterRegistrationBean(); regist.setFilter(repalaceStream()); regist.addUrlPatterns("/*"); return regist; } @Bean public Filter repalaceStream() { return new RepalceStreamFilter(); } }
在请求到达Servlet容器之后,会根据过滤器配置进行匹配,找到对应的过滤器。在执行过滤器的doFilter方法之前,会先执行过滤器的init方法,进行一些初始化操作。在doFilter方法中,可以对请求和响应进行过滤和处理。在过滤器处理完毕之后,会执行过滤器的destroy方法,进行一些清理操作。
总的来说,Spring中的过滤器是基于Servlet规范实现的,通过过滤器可以对请求和响应进行过滤和处理,实现了请求的统一处理和异常处理等功能。
过滤器和拦截器哟什么区别和联系?
过滤器和拦截器都是用于对请求进行处理的组件,但是它们有一些区别和联系。
1. 触发时间不同:过滤器是在请求到达Servlet容器之前或响应返回到客户端之前进行处理的,而拦截器是在请求到达Controller之前或响应返回到客户端之前进行处理的。
2. 作用范围不同:过滤器可以对所有的请求进行过滤,包括静态资源的请求,而拦截器只能对Controller的请求进行拦截。
3. 实现方式不同:过滤器是基于Servlet规范实现的,而拦截器是基于AOP实现的。
4. 功能不同:过滤器主要用于对请求和响应进行过滤和处理,如字符编码、参数验证、安全控制等;而拦截器主要用于对请求进行预处理和后处理,如记录日志、统一处理等。
5. 执行顺序不同:过滤器的执行顺序是根据web.xml文件中的配置顺序来确定的,而拦截器的执行顺序是根据拦截器的配置顺序来确定的。
虽然过滤器和拦截器有一些区别,但是它们也有一些联系。它们都是用于对请求进行处理的组件,可以对请求进行预处理和后处理,实现了请求的统一处理和异常处理等功能。同时,它们也可以配合使用,如在过滤器中进行字符编码处理,在拦截器中进行日志记录等。