JAVA通过Filter实现允许服务跨域请求的方法

 更新时间:2018年11月26日 10:19:42   作者:王炎炎  
这里的域指的是这样的一个概念:我们认为若协议 + 域名 + 端口号均相同,那么就是同域即我们常说的浏览器请求的同源策略。这篇文章主要介绍了JAVA通过Filter实现允许服务跨域请求,需要的朋友可以参考下

概念

 在 HTML 中,<a>, <form>, <img>, <script>, <iframe>, <link> 等标签以及 Ajax 都可以指向一个资源地址, 而所谓的跨域请求就是指:当前发起请求的域与该请求指向的资源所在的域不一样。

 这里的域指的是这样的一个概念:我们认为若协议 + 域名 + 端口号均相同,那么就是同域即我们常说的浏览器请求的同源策略。

Jsonp

 在前后端分离的项目中,会经常遇到需要跨域请求的问题。跨域请求有多种方式。之前接触过jsonp的方式。
 这种方式是在前端页面进行跨域请求兼容性好,但安全性比较差,只支持GET请求。

CORS

 Cross-Origin Resource Sharing 即跨源资源共享 。是一个新的 W3C 标准,它新增的一组HTTP首部字段,允许服务端其声明哪些源站有权限访问哪些资源。

 也就是说它允许浏览器向声明了 CORS 的跨域服务器,发出 XMLHttpReuest 请求,从而克服 Ajax 只能同源使用的限制。

Http头部字段介绍

 Access-Control-Allow-Origin:响应首部中可以携带这个头部表示服务器允许哪些域可以访问该资源
 Access-Control-Allow-Methods:该首部字段用于预检请求的响应,指明实际请求所允许使用的HTTP方法
 Access-Control-Allow-Headers:该首部字段用于预检请求的响应。指明了实际请求中允许携带的首部字段
 Access-Control-Max-Age:该首部字段用于预检请求的响应,指定了预检请求能够被缓存多久
 Access-Control-Allow-Credentials:该字段可选。它的值是一个布尔值,表示是否允许发送Cookie。默认情况下,Cookie不包括在CORS请求之中。设为true,即表示服务器明确许可,Cookie可以包含在请求中,一起发给服务器

具体实现

这里通过过滤器的方式对请求进行拦截。设置http的响应header来实现。

public class CrossFilter implements Filter {
  protected Logger logger = LoggerFactory.getLogger(getClass());
  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
  }
  @Override
  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    HttpServletRequest request=(HttpServletRequest)servletRequest;
    HttpServletResponse response=(HttpServletResponse)servletResponse;
    logger.info("【允许跨域访问】refererUrl【{}】", request.getHeader("Referer"));
    //允许跨域访问
    response.setContentType("text/html;charset=UTF-8");
    response.setHeader("Access-Control-Allow-Origin", "https://monline.01zhuanche.com");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
    response.setHeader("Access-Control-Max-Age", "0");
    response.setHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,Authorization,SessionToken,JSESSIONID,token");
    response.setHeader("Access-Control-Allow-Credentials", "true");
    response.setHeader("XDomainRequestAllowed","1");
    filterChain.doFilter(request, response);
  }
  public static String getRefererUrl(HttpServletRequest request){
    String returnValue = null;
    if(request != null && !StringUtils.isEmpty(request.getHeader("Referer"))) {
      returnValue = request.getHeader("Referer");
      String[] urls = returnValue.split("/");
      if(urls != null && urls.length > 3) {
        returnValue = urls[0] + "//" + urls[2];
      }
    }
    return returnValue;
  }
  @Override
  public void destroy() {
  }
}

此外需要对我们的过滤器进行配置,在web.xml文件中添加如下配置:

<filter>
  <filter-name>crossDomainFilter</filter-name>
  <filter-class>com.open.advertise.api.cooperation.filter.CrossFilter</filter-class>
  <init-param>
   <param-name>targetFilterLifecycle</param-name>
   <param-value>true</param-value>
  </init-param>
 </filter>

 <filter-mapping>
  <filter-name>crossDomainFilter</filter-name>
  <url-pattern>/*</url-pattern> <!--可以针对某个接口进行限制-->
 </filter-mapping>

以上,对于设置的跨域请求的域名就可以进行跨域访问啦。

以上所述是小编给大家介绍的JAVA通过Filter实现允许服务跨域请求,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • dubbo将异常转换成RuntimeException的原因分析 ExceptionFilter

    dubbo将异常转换成RuntimeException的原因分析 ExceptionFilter

    这篇文章主要介绍了dubbo将异常转换成RuntimeException的原因分析 ExceptionFilter问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Hibernate初体验及简单错误排除代码详解

    Hibernate初体验及简单错误排除代码详解

    这篇文章主要介绍了Hibernate初体验及简单错误排除代码详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • SpringBoot详细讲解静态资源导入的实现

    SpringBoot详细讲解静态资源导入的实现

    在Web开发过程中,我们需要接触许多静态资源,如CSS、JS、图片等;在之前的开发中,这些资源都放在Web目录下,用到的时候按照对应路径访问即可。不过在SpringBoot项目中,没有了Web目录,那这些静态资源该放到哪里去,又要如何访问呢?这就是我们要讲的静态资源导入
    2022-05-05
  • StreamAPI多次消费一个stream代码实例

    StreamAPI多次消费一个stream代码实例

    这篇文章主要介绍了StreamAPI多次消费一个stream代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Java详细解析下拉菜单和弹出菜单的使用

    Java详细解析下拉菜单和弹出菜单的使用

    这篇文章主要介绍了怎么用Java来创建和使用下拉菜单和弹出菜单,下拉菜单和弹出菜单是我们经常要用的工具,但是你有想过自己怎么去实现它吗,感兴趣的朋友跟随文章往下看看吧
    2022-04-04
  • SpringBoot读写xml上传到AWS存储服务S3的示例

    SpringBoot读写xml上传到AWS存储服务S3的示例

    这篇文章主要介绍了SpringBoot读写xml上传到S3的示例,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下
    2020-10-10
  • Spring和SpringBoot之间的区别

    Spring和SpringBoot之间的区别

    这篇文章主要介绍了Spring和SpringBoot之间的区别,帮助大家更好的理解和学习使用这两种框架,感兴趣的朋友可以了解下
    2021-04-04
  • Springboot使用redis进行api防刷限流过程详解

    Springboot使用redis进行api防刷限流过程详解

    这篇文章主要介绍了Springboot使用redis进行api防刷限流过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Java高级之虚拟机加载机制的实例讲解

    Java高级之虚拟机加载机制的实例讲解

    下面小编就为大家分享一篇Java高级之虚拟机加载机制的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • java 使用异常的好处总结

    java 使用异常的好处总结

    这篇文章主要介绍了java 使用异常的好处总结的相关资料,需要的朋友可以参考下
    2017-03-03

最新评论