专栏首页Spring相关使用切片拦截Rest服务

使用切片拦截Rest服务

使用切片拦截Rest服务

1.使用过滤器Filter:

我们可以在建立的springboot的项目中建立新的类来是先Filter的接口,doFilter是过滤器中的主要方法,用来做处理逻辑,最后我们只需要在类上加@Component注解就可以让过滤器生效了.

package com.city.web;

import org.springframework.stereotype.Component;
import javax.servlet.*;
import java.io.IOException;
import java.util.Date;

@Component
public class TimeFilter implements Filter {


    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("time filter init!");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        System.out.println("time filter start");
        long start = new Date().getTime();

        chain.doFilter(request,response);
        System.out.println("time filter:"+(new Date().getTime()-start));

        System.out.println("time filter finish");
    }

    @Override
    public void destroy() {
        System.out.println("time filter destroy!");
    }
}

当然我们也可以不用@Component注解,但是需要建一个配置类,也可以让过滤器生效,如下:

package com.city.web.configer;

import com.city.web.TimeFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.ArrayList;
import java.util.List;

@Configuration
public class WebConfig {

    @Bean
    public FilterRegistrationBean timeFilter2(){

        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();

        TimeFilter timeFilter = new TimeFilter();

        filterRegistrationBean.setFilter(timeFilter);

        List<String> urls = new ArrayList<>();

        urls.add("/*");

        filterRegistrationBean.setUrlPatterns(urls);

        return  filterRegistrationBean;
    }
}

2.使用拦截器HandlerInterceptor

建立TimeInterecepter实现HandlerInterceptor,如下:

package com.city.web.interecepter;

import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;

@Component
public class TimeInterecepter implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle");
        request.setAttribute("startTime", new Date().getTime());
        System.out.println(((HandlerMethod) handler).getBean().getClass().getName());
        System.out.println(((HandlerMethod) handler).getMethod().getName());
        return true; //这里控制是否调用后面的方法 建议返回true
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("preHandle");
        Long start = (Long) request.getAttribute("startTime");
        System.out.println("time intercepter 耗时:" + (new Date().getTime() - start));
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion");
        Long start = (Long) request.getAttribute("startTime");
        System.out.println("time intercepter 耗时:" + (new Date().getTime() - start));
        System.out.println("ex is "+ex);

    }

}

这里的类写好后还必须在配置类中配置这个拦截器才会使其生效,如下所示:

package com.city.web.configer;

import com.city.web.TimeFilter;
import com.city.web.interecepter.TimeInterecepter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import java.util.ArrayList;
import java.util.List;

@Configuration
public class WebConfig  extends WebMvcConfigurerAdapter {

    @Autowired
    private TimeInterecepter timeInterecepter;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(timeInterecepter);
    }


}

3.使用切片:

image.png

比如我们要切入DemoApplication这个类中:

package com.city.web.aspect;

import com.navercorp.pinpoint.common.annotations.InterfaceAudience;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import java.security.PublicKey;
import java.util.Date;

@Aspect
@Component
public class TimeAspect {

    @Around("execution(* com.city.DemoApplication.*(..))")
    public Object handleControllerMethod(ProceedingJoinPoint pjp) throws Throwable {

        long start = new Date().getTime();
        Object[] args = pjp.getArgs();
        for (Object arg : args) {
            System.out.println("arg is "+arg);
        }

        System.out.println("time aspect start");
        Object object = pjp.proceed();

        System.out.println("time aspect 耗时:"+(new Date().getTime()-start));

        System.out.println("time aspect end");

        return object;
    }

}

关于restful的API拦截的处理层级关系:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • springBoot上传文件时MultipartFile报空问题解决方法

    之前用spring MVC,转成spring boot之后发现上传不能用。网上参考说是spring boot已经有CommonsMultipartResolve...

    Dream城堡
  • oauth2.0通过JdbcClientDetailsService从数据库读取相应的配置

    在上一节我们讲述的配置是把授权码存储在redis中,把相应的请求的路径用使用in-memory存储 ,这个是放在了内存中,但是实际开发我们的数据希望是从数据表中...

    Dream城堡
  • 第12章—使用NoSQL数据库—使用MongoDB+Jpa操作数据库

    SpringData还提供了对多种NoSQL数据库的支持,包括MongoDB;neo4j和redis.他不仅支持自动化的repository,还支持基于模板的数...

    Dream城堡
  • Spring Boot整合Scheduled定时任务器、整合Quartz定时任务框架

    首先说明一下,这里使用的是Springboot2.2.6.RELEASE版本,由于Springboot迭代很快,所以要注意版本问题。

    别先生
  • 作业调度框架Quartz

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

    奋飛
  • geotools实现shp数据的缓冲区分析

    lzugis
  • Spring Boot(十四)RabbitMQ延迟队列

    延迟队列的使用场景:1.未按时支付的订单,30分钟过期之后取消订单;2.给活跃度比较低的用户间隔N天之后推送消息,提高活跃度;3.过1分钟给新注册会员的用户,发...

    Java中文社群_老王
  • Springboot 整合RabbitMQ ---基于Class的开发

    用户5927264
  • Appium中如何获取Toast内容信息

    在两年前也就是2017年3月6号07:22分,我才看到appium1.6.3版本的发布,更新内容为Ios上可以实现Toast的获取,而Windows也就是安卓端...

    软件测试君
  • javaEE项目Multipartfile实现文件上传下载并解决上传与下载文件中文乱码的问题

    里面包含了文件上传下载并解决上传与下载文件中文乱码的问题,运用正则表达式判断字符串中是否包含中文和得到一个文件夹下的所有文件的方法,几乎集合了上传下载所需要的所...

    洋仔聊编程

扫码关注云+社区

领取腾讯云代金券