// 注册 Sa-Token全局过滤器
@Bean
public SaReactorFilter getSaReactorFilter() {
return new SaReactorFilter()
// 拦截地址
.addInclude("/**")
//knife4j 文档不拦截
.addExclude("/doc.html", "/webjars/**", "/swagger-resources")
// 鉴权方法:每次访问进入
.setAuth(obj -> {
SaRequest request = SaHolder.getRequest();
if (log.isDebugEnabled()) {
log.debug(request.getUrl());
}
// 登录校验 -- 拦截所有路由,开放登录接口
SaRouterStaff routerStaff = SaRouter.match("/**", "/auth/api/open/**", r -> StpUtil.checkLogin());
if (routerStaff.isHit) {
}
})
// 异常处理方法:每次setAuth函数出现异常时进入
.setError(e -> {
if (e instanceof NotLoginException) {
log.error("token失效!");
} else {
e.printStackTrace();
log.error("error!", e);
}
return Result.fail(e.getMessage());
}) // 前置函数:在每次认证函数之前执行
.setBeforeAuth(o -> {
this.configCross();
});
}
/**
* 配置跨域
*/
private void configCross() {
// ---------- 设置跨域响应头 ----------
SaHolder.getResponse()
// 允许指定域访问跨域资源
.setHeader("Access-Control-Allow-Origin", "*")
// 允许所有请求方式
.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE")
// 有效时间
.setHeader("Access-Control-Max-Age", "3600")
// 允许的header参数
.setHeader("Access-Control-Allow-Headers", "*");
// 如果是预检请求,则立即返回到前端
SaRouter.match(SaHttpMethod.OPTIONS).free(r -> log.warn("--------OPTIONS预检请求,不做处理")).back();
}
server {
listen 80;
#此处应配置 否则不存在的会跨域
server_name www.xxxx.com xxxx.com;
#应放开对options请求拦截
if ($request_method !~ ^(GET|POST|OPTIONS)$) {
return 403;
}
}