暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

前后端分离权限及跨域问题方案

紫溪的世界 2021-02-05
875

后端使用权限控制框架(shiro)做安全管理


前端登录后访问shiro本身做拦截,导致访问接口失败


解决办法:自定义sessionid拦截器做统一处理


方法如下

自定义sessionManager

可以获取到当前登录人的sessionId从而得到登录人是谁


后台统一处理异常类




跨域解决方案

在 CORS 协议中,前端如果需要每次携带 cookie,就得把 withCredentials 设置成 true。所以在开发阶段我将配置类的 Access-Control-Allow-Origin 设置成 *,Access-Control-Allow-Credentials 设置成 true。但是在遇到 PUT 方法的接口(非预检请求)时,由于 options 类型的预检请求不带 cookie 所以被拦截在外。

非简单请求

请求分为非简单请求和简单请求,其中预检请求就是导致我们联调发生的问题的原因。
非简单请求是那种对服务器有特殊要求的请求,比如请求方法是 PUT 或 DELETE,或者 Content-Type 字段的类型是 application/json。
非简单请求的 CORS 请求,会在正式通信之前,增加一次 HTTP 查询请求,称为"预检"请求(preflight)。
浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些 HTTP 动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的 XMLHttpRequest 请求,否则就报错。
当请求方法是 PUT 或 DELETE,或者 Content-Type 字段的类型是 application/json 就会触发询问服务器的回应,要求服务器确认可以这样请求
 

解决方法

我们将需要预检请求的方法 "OPTIONS".equals(request.getMethod()) 放行,同时把 Access-Control-Allow-Headers 和 Access-Control-Allow-Origin 设置成请求的 HTTP 头信息,这样可以保证都放行。实际的配置就是如下:



文章转载自紫溪的世界,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论