前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用切片拦截Rest服务

使用切片拦截Rest服务

作者头像
Dream城堡
发布2019-03-11 11:52:19
4670
发布2019-03-11 11:52:19
举报
文章被收录于专栏:Spring相关Spring相关

使用切片拦截Rest服务

1.使用过滤器Filter:

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

代码语言:javascript
复制
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注解,但是需要建一个配置类,也可以让过滤器生效,如下:

代码语言:javascript
复制
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,如下:

代码语言:javascript
复制
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);

    }

}

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

代码语言:javascript
复制
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这个类中:

代码语言:javascript
复制
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拦截的处理层级关系:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.02.27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用切片拦截Rest服务
    • 1.使用过滤器Filter:
      • 2.使用拦截器HandlerInterceptor
        • 3.使用切片:
          • 比如我们要切入DemoApplication这个类中:
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档