欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-03 22:39:58
拦截器功能强大,能够深入方法前后,常应用于日志记录、权限检查和性能检测等,几乎是项目中不可或缺的一部分,本文就来实现spring boot自定义拦截器的配置。 理论指导...

拦截器功能强大,能够深入方法前后,常应用于日志记录、权限检查和性能检测等,几乎是项目中不可或缺的一部分,本文就来实现spring boot自定义拦截器的配置。

理论指导

问:spring boot怎么配置拦截器?

答:配置一个拦截器需要两步完成。

  1. 自定义拦截器,实现handlerinterceptor这个接口。这个接口包括三个方法,prehandle是请求执行前执行的,posthandler是请求结束执行的,但只有prehandle方法返回true的时候才会执行,aftercompletion是视图渲染完成后才执行,同样需要prehandle返回true,该方法通常用于清理资源等工作。
  2. 注册拦截器。 作用是确定拦截器和拦截的url。需要继承webmvcconfigurationsupport并重写addinterceptor方法,webmvcconfigureadapter已经过时了!!

代码实现

目录结构:

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

具体代码:

myinterceptor.java

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

/**
 * 继承webmvcconfigurationsupport继承并重写addinterceptor方法用于注册拦截器
 * webmvcconfigureadapter已经过时了!!
 */
@configuration
public class registerinterceptor extends webmvcconfigurationsupport {
  @override
  public void addinterceptors(interceptorregistry registry) {
    registry.addinterceptor(new myinterceptor()).addpathpatterns("/**");
    super.addinterceptors(registry);
  }
}

拦截效果

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

更新

跨域访问

由于javascript同源策略,凡是发送请求url的协议、域名、端口三者之间任意一与当前页面地址不同即为跨域。具体的看下表

url
说明
是否允许通信
http://www.a.com/a.js
http://www.a.com/b.js
同一域名下
允许
http://www.a.com/lab/a.js
http://www.a.com/script/b.js
同一域名下不同文件夹
允许
http://www.a.com:8000/a.js
http://www.a.com/b.js
同一域名,不同端口
不允许
http://www.a.com/a.js
https://www.a.com/b.js
同一域名,不同协议
不允许
http://www.a.com/a.js
http://70.32.92.74/b.js
域名和域名对应ip
不允许
http://www.a.com/a.js
http://script.a.com/b.js
主域相同,子域不同
不允许
http://www.a.com/a.js
http://a.com/b.js
同一域名,不同二级域名(同上)
不允许(cookie这种情况下也不允许访问)
http://www.cnblogs.com/a.js
http://www.a.com/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。

①在拦截器中添加一个设置请求头的方法。

  public void crossdomain(httpservletrequest request, httpservletresponse response) {
    response.setheader("access-control-allow-origin", request.getheader("origin"));
    response.setheader("access-control-allow-credentials", "true");
  }

②在prehandle中调用这个方法。

public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler)
      throws exception {
    crossdomain(request, response);
    long starttime = system.currenttimemillis();
    request.setattribute("starttime", starttime);
    return true;
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。