spring boot 拦截器——迹忆客-ag捕鱼王app官网

在以下情况下可以使用 spring boot 中的 interceptor 进行操作:

  • 在向控制器发送请求之前;
  • 在向客户端发送响应之前

例如,我们可以使用拦截器在向控制器发送请求之前添加请求头,并在向客户端发送响应之前添加响应头。

要使用拦截器,需要创建支持它的 @component 类,并且它应该实现 handlerinterceptor 接口。

以下是我们在使用拦截器时应该了解的三种方法

  • prehandle() 方法 - 这用于在将请求发送到控制器之前执行操作。 此方法应返回 true 以将响应返回给客户端。
  • posthandle() 方法 - 用于在向客户端发送响应之前执行操作。
  • aftercompletion() 方法 - 用于在完成请求和响应后执行操作。

查看以下代码来更好地理解

@component
public class productserviceinterceptor implements handlerinterceptor {
   @override
   public boolean prehandle(
      httpservletrequest request, httpservletresponse response, object handler) throws exception {
      
      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 exception) throws exception {}
}

我们必须使用 webmvcconfigureradapterinterceptorregistry 注册此拦截器,如下所示

@component
public class productserviceinterceptorappconfig extends webmvcconfigureradapter {
   @autowired
   productserviceinterceptor productserviceinterceptor;
   @override
   public void addinterceptors(interceptorregistry registry) {
      registry.addinterceptor(productserviceinterceptor);
   }
}

在下面给出的示例中,我们将使用 get products api,它给出如下所示的输出

下面给出拦截器类 productserviceinterceptor.java 的代码

package com.study.interceptor;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
import org.springframework.stereotype.component;
import org.springframework.web.servlet.handlerinterceptor;
import org.springframework.web.servlet.modelandview;
/**
 * @author jiyik.com
 */
@component
public class productserviceinterceptor implements handlerinterceptor {
    @override
    public boolean prehandle (httpservletrequest request, httpservletresponse response, object handler)
            throws exception {
        system.out.println("pre handle 方法正在调用");
        return true;
    }
    @override
    public void posthandle (httpservletrequest request, httpservletresponse response,
                           object handler, modelandview modelandview) throws exception {
        system.out.println("post handle 方法正在调用");
    }
    @override
    public void aftercompletion (httpservletrequest request, httpservletresponse response, object
                    handler, exception exception) throws exception {
        system.out.println("请求和响应顺利完成");
    }
}

将拦截器注册到拦截器注册表中的应用程序配置类文件的代码 - productserviceinterceptorappconfig.java 如下所示

package com.study.interceptor;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.web.servlet.config.annotation.interceptorregistry;
import org.springframework.web.servlet.config.annotation.webmvcconfigureradapter;
/**
 * @author jiyik.com
 */
public class productserviceinterceptorappconfig extends webmvcconfigureradapter {
    @autowired
    productserviceinterceptor productserviceinterceptor;
    @override
    public void addinterceptors(interceptorregistry registry) {
        registry.addinterceptor(productserviceinterceptor);
    }
}

controller类文件 productservicecontroller.java 的代码如下

package com.study.controller;
import java.util.hashmap;
import java.util.map;
import com.study.exception.productnotfoundexception;
import org.springframework.http.httpstatus;
import org.springframework.http.responseentity;
import org.springframework.web.bind.annotation.pathvariable;
import org.springframework.web.bind.annotation.requestbody;
import org.springframework.web.bind.annotation.requestmapping;
import org.springframework.web.bind.annotation.requestmethod;
import org.springframework.web.bind.annotation.restcontroller;
import com.study.model.product;
@restcontroller
public class productservicecontroller {
    private static map productrepo = new hashmap<>();
    static {
        product honey = new product();
        honey.setid("1");
        honey.setname("honey");
        productrepo.put(honey.getid(), honey);
        product almond = new product();
        almond.setid("2");
        almond.setname("almond");
        productrepo.put(almond.getid(), almond);
    }
    @requestmapping(value = "/products")
    public responseentity
网站地图