教程 > spring boot 中文教程 >
阅读:72
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 {}
}
我们必须使用 webmvcconfigureradapter
向 interceptorregistry
注册此拦截器,如下所示
@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