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文件中的配置顺序来确定的,而拦截器的执行顺序是根据拦截器的配置顺序来确定的。
虽然过滤器和拦截器有一些区别,但是它们也有一些联系。它们都是用于对请求进行处理的组件,可以对请求进行预处理和后处理,实现了请求的统一处理和异常处理等功能。同时,它们也可以配合使用,如在过滤器中进行字符编码处理,在拦截器中进行日志记录等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值