shiro+ajax无法访问,Spring boot + Shiro 在前后端分离时,ajax跨域问题(OPTIONS问题)...

在前后端分离时,遇到前端请求后报跨域

77ebe9240a2a217623475e58a16f1f57.png

后台已经进行过spring boot 的统一跨域处理。按理说不会出现这个问题,因为跨域是指一个用户从网站A访问网站B的资源,导致出现一个跨域请求,一般出现在前后端分离项目的页面访问接口的时候。可即使处理过,依旧存在这个问题。

我的情况是,前端页面登录可用,其余接口无法使用,初步怀疑是shiro的问题。在确认前端headers 中包含正确的权限字符串后。我就写了个过滤器,查看请求具体情况。

import javax.servlet.*;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;public class MyOptionsFilter implementsFilter {

@Overridepublic voiddoFilter(ServletRequest req, ServletResponse resp,

FilterChain chain)throwsIOException, 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值