好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Spring Boot配置拦截器及实现跨域访问的方法

拦截器 功能强大,能够深入方法前后,常应用于日志记录、权限检查和性能检测等,几乎是项目中不可或缺的一部分,本文就来实现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配置拦截器及实现跨域访问的方法的详细内容...

  阅读:19次