您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

SpringBoot怎么使用Interceptor拦截器

2024/4/26 7:21:04发布22次查看
在springboot中使用拦截器也比较简单,实现handlerinterceptor或者asynchandlerinterceptor接口,再从配置里添加一下拦截器就完成了;
asynchandlerinterceptor接口继承了handlerinterceptor,多了一个afterconcurrenthandlingstarted方法:
接口里的方法:
prehandle:在controller之前执行,可以判断参数,执行的controller方法等,返回值为boolean,返回true继续往下运行(下面的拦截器和controller),否则开始返回操作(执行之前的拦截器返回等操作);
posthandle:在controller之后,视图返回前执行,可对modelandview进行处理再返回;
aftercompletion:请求完成后执行;
afterconcurrenthandlingstarted:controller返回值是java.util.concurrent.callable时才会调用该方法并使用新线程运行;
方法执行顺序有两种:
prehandle -> 执行controller -> posthandle -> aftercompletion;
prehandle -> 执行controller -> afterconcurrenthandlingstarted -> callable线程执行call()方法 -> 新线程开始prehandle -> posthandle -> aftercompletion;(controller方法返回callable对象时)
配置拦截器:
实现webmvcconfigurer接口里的addinterceptors方法,使用参数interceptorregistry对象添加自己的拦截器,可以添加指定拦截路径或者去掉某些过滤路径,还可以设置拦截器的优先级order,优先级由小到大,默认0;
多个拦截器的执行顺序:
prehandle方法按照order由小到大顺序,执行完controller后,其他方法则反向顺序,跟过滤器filter类似;
测试启动类,默认配置:
/** * 2023年3月16日下午4:56:23 */package testspringboot.test9interceptor; import org.springframework.boot.springapplication;import org.springframework.boot.autoconfigure.springbootapplication; /** * @author xwf * */@springbootapplicationpublic class test9main { /** * @param args */ public static void main(string[] args) { springapplication.run(test9main.class, args); } }
controller类:
/** * 2023年3月16日下午4:58:02 */package testspringboot.test9interceptor; import java.util.concurrent.callable; import org.springframework.web.bind.annotation.requestmapping;import org.springframework.web.bind.annotation.restcontroller; /** * @author xwf * */@restcontroller@requestmapping("/interceptor")public class test9controller { @requestmapping("/a") public string a(string s) { system.out.println(">>>a():" + s); return "ok"; } @requestmapping("/b") public callable<string> b() { callable<string> callable = new callable<string>() { @override public string call() throws exception { thread.sleep(2000); system.out.println("call() thread id=" + thread.currentthread().getid()); thread.sleep(2000); return "abcdefg"; } }; system.out.println(">>>b()"); return callable; } }
两个自定义拦截器1和2:
/** * 2023年3月16日下午5:14:14 */package testspringboot.test9interceptor; import javax.servlet.http.httpservletrequest;import javax.servlet.http.httpservletresponse; import org.springframework.web.servlet.handlerinterceptor;import org.springframework.web.servlet.modelandview; /** * @author xwf * */public class myinterceptor1 implements handlerinterceptor { @override public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) throws exception { system.out.println("prehandle 1, handler=" + handler); return request.getquerystring().length() < 10 ? true : false; } @override public void posthandle(httpservletrequest request, httpservletresponse response, object handler, modelandview modelandview) throws exception { system.out.println("posthandle 1"); } @override public void aftercompletion(httpservletrequest request, httpservletresponse response, object handler, exception ex) throws exception { system.out.println("aftercompletion 1"); } }
/** * 2023年3月16日下午5:15:28 */package testspringboot.test9interceptor; import java.util.date; import javax.servlet.http.httpservletrequest;import javax.servlet.http.httpservletresponse; import org.springframework.stereotype.component;import org.springframework.web.servlet.asynchandlerinterceptor;import org.springframework.web.servlet.modelandview; /** * @author xwf * */@componentpublic class myinterceptor2 implements asynchandlerinterceptor { @override public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) throws exception { system.out.println("prehandle 2 " + new date() + " threadid=" + thread.currentthread().getid()); return true; } @override public void posthandle(httpservletrequest request, httpservletresponse response, object handler, modelandview modelandview) throws exception { system.out.println("posthandle 2"); } @override public void aftercompletion(httpservletrequest request, httpservletresponse response, object handler, exception ex) throws exception { system.out.println("aftercompletion 2"); } @override public void afterconcurrenthandlingstarted(httpservletrequest request, httpservletresponse response, object handler) throws exception { system.out.println("afterconcurrenthandlingstarted 2 " + new date()); } }
配置拦截器:
/** * 2023年3月16日下午5:20:31 */package testspringboot.test9interceptor; import javax.annotation.resource; import org.springframework.context.annotation.configuration;import org.springframework.web.servlet.config.annotation.interceptorregistry;import org.springframework.web.servlet.config.annotation.webmvcconfigurer; /** * @author xwf * */@configurationpublic class myinterceptorconfig implements webmvcconfigurer { @resource myinterceptor2 myinterceptor2; @override public void addinterceptors(interceptorregistry registry) { registry.addinterceptor(new myinterceptor1()) .addpathpatterns("/interceptor/a") //添加拦截路径,两种参数list<string>和string ... .excludepathpatterns("/interceptor/b") //排除路径,两种参数list<string>和string ... .order(1); //设置拦截器顺序,由小到大,默认0 registry.addinterceptor(myinterceptor2); //也可以使用spring管理的对象 } }
发送一个post测试请求:http://192.168.1.30:8080/interceptor/a?s=hello,拦截器2的order默认0,拦截器1的order为1,prehandle先执行2的,controller执行之后,剩下的handle都是先执行1再执行2的;
发送prehandle返回false的请求:http://192.168.1.30:8080/interceptor/a?s=hello123456789,拦截器1的prehandle返回false后,直接执行2的aftercompletion;
发送测试callable的请求:http://192.168.1.30:8080/interceptor/b?s=hello,拦截路径配置跳过拦截器1只执行拦截器2,通过threadid可以看到前后使用的是两个线程;
以上就是springboot怎么使用interceptor拦截器的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product