Spring boot + Shiro 在前后端分离时,ajax跨域问题(OPTIONS问题)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Spring boot + Shiro 在前后端分离时,ajax跨域问题(OPTIONS问题),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2364字,纯文字阅读大概需要4分钟。
内容图文
在前后端分离时,遇到前端请求后报跨域
后台已经进行过spring boot 的统一跨域处理。按理说不会出现这个问题,因为跨域是指一个用户从网站A访问网站B的资源,导致出现一个跨域请求,一般出现在前后端分离项目的页面访问接口的时候。可即使处理过,依旧存在这个问题。
我的情况是,前端页面登录可用,其余接口无法使用,初步怀疑是shiro的问题。在确认前端headers 中包含正确的权限字符串后。我就写了个过滤器,查看请求具体情况。
import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; publicclass MyOptionsFilter implements Filter { @Override publicvoid doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; } }
发现请求过来的请求不是 GET / POST 而是 OPTIONS !
查阅文章后发现,这是ajax在设置header后发送请求,它会先发送OPTIONS请求,验证服务端是否可用,再发送GET / POST请求。即 请求两次!
发现可能存在的问题后,在过滤器中对OPTIONS请求做处理即可
import org.springframework.http.HttpStatus; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class MyOptionsFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; response.setHeader("Access-control-Allow-Origin", request.getHeader("Origin")); response.setHeader("Access-Control-Allow-Credentials", "true"); //为true时 Origins设置为 * 可能会存在问题! response.setHeader("Access-Control-Allow-Headers", request.getHeader("Access-Control-Request-Headers")); response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT"); if ("OPTIONS".equals(request.getMethod())) { response.setStatus(HttpStatus.NO_CONTENT.value()); return; } else { chain.doFilter(request, response); } } }
因为我使用的框架是spring boot 需要在shiro的config中配置过滤器,代码如下。
@Bean public FilterRegistrationBean replaceTokenFilter(){ FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setName("MyOptionsFilter");//spring 协助注入,注意名称不要重复 registration.setFilter( new MyOptionsFilter()); registration.setDispatcherTypes(DispatcherType.REQUEST); //拦截请求 registration.addUrlPatterns("/*");//拦截请求url registration.setOrder(1);//排序第一,避免影响。 return registration; }
原文:https://www.cnblogs.com/ShineAnthony/p/14124495.html
内容总结
以上是互联网集市为您收集整理的Spring boot + Shiro 在前后端分离时,ajax跨域问题(OPTIONS问题)全部内容,希望文章能够帮你解决Spring boot + Shiro 在前后端分离时,ajax跨域问题(OPTIONS问题)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。