springboot+shiro 跨域解决(OPTIONS)
拦截器判断
拦截器截取到请求先进行判断,如果是OPTIONS请求的话,则放行
import com.alibaba.fastjson.JSON;
import com.zp.demo.util.JwtHelperUtil;
import org.apache.commons.lang.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authc.AuthenticationFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map; //需要认证的API被调用前执行的拦截器也叫过滤器
public class TokenFilter extends AuthenticationFilter { private final Logger logger = LoggerFactory.getLogger(TokenFilter.class); @Override
protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
try {
//这几句代码是关键
if ("OPTIONS".equals(request.getMethod())){
response.setStatus(org.apache.http.HttpStatus.SC_NO_CONTENT);;
logger.info("OPTIONS 放行");
return true;
}
String token = getToken(servletRequest);
//判断token 是否为空
if (StringUtils.isEmpty(token)) {
this.printUnauthorized("401", (HttpServletResponse) servletResponse);
return false;
} else {//不为空判断是否过期
Map maps = (Map) JSON.parse(JwtHelperUtil.validateLogin(token));
if (maps == null) {
logger.info("token过期返回403");
response.setStatus(403);//可以用response.getWriter()返回json或你想要的格式,同时设置header: Content-Type:text/json
return false;
}
}
} catch (Exception e) {
logger.error("空指针异常", e);
}
logger.info("token有效放行");
return true;
}
private String getToken(ServletRequest servletRequest) {
HttpServletRequest request = (HttpServletRequest) servletRequest;
String authorizationHeader = request.getHeader("Authorization");//获取请求头中的Authorization属性
//System.out.println(authorizationHeader);
if (!StringUtils.isEmpty(authorizationHeader)) {
return authorizationHeader.replace(" ", "");
}
return null;
} private void printUnauthorized(String messageCode, HttpServletResponse response) {
String content = String.format("{\"code\":\"%s\",\"msg\":\"%s\"}", messageCode, HttpStatus.UNAUTHORIZED.getReasonPhrase());
response.setContentType("application/json;charset=UTF-8");
response.setContentLength(content.length());
response.setStatus(HttpStatus.UNAUTHORIZED.value());
try {
PrintWriter writer = response.getWriter();
writer.write(content);
} catch (IOException var5) {
var5.printStackTrace();
} }
}
配置跨越:
import org.springframework.stereotype.Component; import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; /*
配置跨越访问
*/
@Component
public class AllowOriginFilter implements Filter { @SuppressWarnings("unused")
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest request = (HttpServletRequest) req;
response.setHeader("Access-Control-Allow-Origin", "*"); // 设置允许所有跨域访问
response.setHeader("Access-Control-Allow-Methods", "POST,GET,PUT,OPTIONS,DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Origin,X-Requested-With,Content-Type,Accept,Authorization,token");
response.setHeader("Access-Control-Allow-Credentials", "true");
chain.doFilter(req, res);
} public void init(FilterConfig filterConfig) {
} public void destroy() {
} }
springboot+shiro 跨域解决(OPTIONS)的更多相关文章
- SpringBoot实现跨域
一.什么是跨域请求? 跨域请求,就是说浏览器在执行脚本文件的ajax请求时,脚本文件所在的服务地址和请求的服务地址不一样.说白了就是ip.网络协议.端口都一样的时候,就是同一个域,否则就是跨域.这是由 ...
- SpringBoot Ajax跨域问题(session共享问题)
ajax 发送post请求至springBoot出现跨域问题 需要在springBoot加上注解 @CrossOrigin 就能解决 报错信息 前端js代码 如果用上面的方式,session不能共享 ...
- Angular2发送HTTP请求SpringBoot后台跨域问题解决
Angular通过http发送post请求至SpringBoot的Controller,由于同源策略的保护,遇到跨域问题: • 源(origin)就是协议(http).域名(localhost)和端口 ...
- ssm跨域解决
最近挑战杯项目要交了,最后一个开发的项目,还是得好好对待,不知道会不会真香,昨天还是遇到了一些问题,尤其是对接的时候,用postman对接的时候,没有啥问题,结果前端上线对接时,发现ajax无法请求到 ...
- JavaScript跨域解决办法
在找到跨域解决办法之前,我们要先弄清楚一些基本概念 什么是跨域? 什么是“同源策略”? 跨文档消息通信 & 跨域请求数据 主域相同而子域不同 不同域名的跨域访问 什么是跨域? 简单地理解就是因 ...
- JAVA联调接口跨域解决办法
JAVA联调接口跨域解决办法 第一种代码: HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,HttpStatus. ...
- [转]vue跨域解决方法
vue跨域解决方法 vue项目中,前端与后台进行数据请求或者提交的时候,如果后台没有设置跨域,前端本地调试代码的时候就会报“No 'Access-Control-Allow-Origin' hea ...
- Springboot实现跨域请求
之所以需要用到跨域请求,目的在于现在的Java项目,几乎基本上都前后端分离,除一些较老的维护项目外(通常是单体或者是maven多模块形式,不过本质上还是将前端放在webapps下). SpringBo ...
- spring mvc 图片上传,图片压缩、跨域解决、 按天生成文件夹 ,删除,限制为图片代码等相关配置
spring mvc 图片上传,跨域解决 按天生成文件夹 ,删除,限制为图片代码,等相关配置 fs.root=data/ #fs.root=/home/dev/fs/ #fs.root=D:/fs/ ...
随机推荐
- PHP如何通过URL访问,获得新的URL 两种方法
1.1 $url = 'http://passport.drcloud.cn/api/logon.asp?id=1&ru=http://203.158.158.122/store/thirdL ...
- MySQL自测测试
#建学生信息表student create table student ( sno varchar(20) not null primary key, sname varchar(20) not nu ...
- MUI 结合layui实现分页
mui自带有分页,在ui上我还是认为layui的友好点. 第三方插件: template-web.js-----------------前端数据绑定 layui.js.layui.css------- ...
- KEIL仿真出现 EVALUATION MODE
原因是KEIL MDK没有破解,重新破解即可
- Spring事务的配置、参数详情及其原理介绍(Transactional)
Spring 事务管理分为编程式和声明式的两种方式.编程式事务指的是通过编码方式实现事务:声明式事务基于 AOP,将具体业务逻辑与事务处理解耦.声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中 ...
- PHP 求两个日期之间相差的天数、月数
<?php /** * 求两个日期之间相差的天数 * (针对1970年1月1日之后,求之前可以采用泰勒公式) * @param string $day1 * @param string $day ...
- 【异常】warning: refname 'feature1.3.0' is ambiguous.导致git merge失败
1 现象 自己git merge --no-ff feature1.3.0 无法合并代码到develop,代码还是停留在feature1.3.0的分支 并提示一下错误 warning: refname ...
- Linux基础知识之文件的权限(一)
Linux基础知识之文件权限(一) Linux优点之一就是它拥有多用户多任务的环境,在提供文件共享的同时也能保证用户文件的安全性.所以,设置文件的权限管理变得尤为重要. 权限讲解 [der@Der ~ ...
- 关于rtos中任务切换时的程序流程
今天和一个小伙伴讨论了一下基于cortex-m3内核的RTOS在任务切换时的程序流程,小伙伴说国内某搜索引擎都搜不到这类的信息,所以我才打算写下来,硬件平台是stm32f1. 这里的切换有两种情况: ...
- 蓝桥杯BASIC-13 数列排序
问题描述 给定一个长度为n的数列,将这个数列按从小到大的顺序排列.1<=n<=200 输入格式 第一行为一个整数n. 第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000. 输 ...