拦截器 功能强大,能够深入方法前后,常应用于日志记录、权限检查和性能检测等,几乎是项目中不可或缺的一部分,本文就来实现spring boot自定义拦截器的配置。
理论指导
问:spring boot怎么配置拦截器?
答:配置一个拦截器需要两步完成。
自定义拦截器,实现handlerinterceptor这个接口。这个接口包括三个方法,prehandle是请求执行前执行的,posthandler是请求结束执行的,但只有prehandle方法返回true的时候才会执行,aftercompletion是视图渲染完成后才执行,同样需要prehandle返回true,该方法通常用于清理资源等工作。 注册拦截器。 作用是确定拦截器和拦截的url。需要继承webmvcconfigurationsupport并重写addinterceptor方法,webmvcconfigureadapter已经过时了!!代码实现
目录结构:
具体代码:
myinterceptor.java
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
public class myinterceptor implements handlerinterceptor {
/** * prehandle在执行controller之前执行,返回true,则继续执行contorller * 返回false则请求中断。 */ @override public boolean prehandle(httpservletrequest httpservletrequest, httpservletresponse httpservletresponse, object o) throws exception { //只有返回true才会继续向下执行,返回false取消当前请求 long starttime = system.currenttimemillis(); httpservletrequest.setattribute( "starttime" , starttime); return true ; }
/** * posthandle是在请求执行完,但渲染modelandview返回之前执行 */ @override public void posthandle(httpservletrequest httpservletrequest, httpservletresponse httpservletresponse, object o, modelandview modelandview) throws exception { long starttime = ( long ) httpservletrequest.getattribute( "starttime" ); long endtime = system.currenttimemillis(); long executetime = endtime - starttime; stringbuilder sb = new stringbuilder( 1000 ); simpledateformat simpledateformat = new simpledateformat( "yyyy-mm-dd hh:mm:ss" ); string date = simpledateformat.format( new date()); sb.append( "-----------------------" ).append(date).append( "-------------------------------------\n" ); sb.append( "uri : " ).append(httpservletrequest.getrequesturi()).append( "\n" ); sb.append( "costtime : " ).append(executetime).append( "ms" ).append( "\n" ); sb.append( "-------------------------------------------------------------------------------" ); system.out.println(sb.tostring()); }
/** * aftercompletion是在整个请求执行完毕后执行 */ @override public void aftercompletion(httpservletrequest httpservletrequest, httpservletresponse httpservletresponse, object o, exception e) throws exception { }
} |
registerinterceptor.java
|
1 2 3 4 5 6 7 8 9 10 11 12 |
/** * 继承webmvcconfigurationsupport继承并重写addinterceptor方法用于注册拦截器 * webmvcconfigureadapter已经过时了!! */ @configuration public class registerinterceptor extends webmvcconfigurationsupport { @override public void addinterceptors(interceptorregistry registry) { registry.addinterceptor( new myinterceptor()).addpathpatterns( "/**" ); super .addinterceptors(registry); } } |
拦截效果
更新
跨域 访问
由于javascript同源策略,凡是发送请求url的协议、域名、端口三者之间任意一与当前页面地址不同即为跨域。具体的看下表
|
url |
说明 |
是否允许通信 |
|
http://HdhCmsTesta测试数据/a.js http://HdhCmsTesta测试数据/b.js |
同一域名下 |
允许 |
|
http://HdhCmsTesta测试数据/lab/a.js http://HdhCmsTesta测试数据/script/b.js |
同一域名下不同文件夹 |
允许 |
|
http://HdhCmsTesta测试数据:8000/a.js http://HdhCmsTesta测试数据/b.js |
同一域名,不同端口 |
不允许 |
|
http://HdhCmsTesta测试数据/a.js https://HdhCmsTesta测试数据/b.js |
同一域名,不同协议 |
不允许 |
|
http://HdhCmsTesta测试数据/a.js http://70.32.92.74/b.js |
域名和域名对应ip |
不允许 |
|
http://HdhCmsTesta测试数据/a.js http://script.a测试数据/b.js |
主域相同,子域不同 |
不允许 |
|
http://HdhCmsTesta测试数据/a.js http://a测试数据/b.js |
同一域名,不同二级域名(同上) |
不允许(cookie这种情况下也不允许访问) |
|
http://HdhCmsTestcnblogs测试数据/a.js http://HdhCmsTesta测试数据/b.js |
不同域名 |
不允许 |
上面代码是可以实现拦截器基本功能,但是这样是不可以跨域访问的,前端请求接口会有报错:xmlhttprequest cannot loadhttp://xxx/. no 'access-control-allow-origin' header is present on the requested resource. origin 'null' is therefore not allowed access.
解决方案是设置请求头access-control-allow-origin为[*]或者设置为和request相同的origin。
①在拦截器中添加一个设置请求头的方法。
|
1 2 3 4 |
public void crossdomain(httpservletrequest request, httpservletresponse response) { response.setheader( "access-control-allow-origin" , request.getheader( "origin" )); response.setheader( "access-control-allow-credentials" , "true" ); } |
②在prehandle中调用这个方法。
|
1 2 3 4 5 6 7 |
public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) throws exception { crossdomain(request, response); long starttime = system.currenttimemillis(); request.setattribute( "starttime" , starttime); return true ; } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
原文链接:https://HdhCmsTestcnblogs测试数据/sgh1023/p/10056859.html
查看更多关于Spring Boot配置拦截器及实现跨域访问的方法的详细内容...