session和cookie
问题
出现的原因
因为前后端分离,前端使用vue,端口号为8080,后端使用springMVC架构,端口号为8081,会因为跨域导致session的丢失
解决思路:
- 在SpringMVC中设置一个filter,其中Access-Control-Allow-Credentials", “true” 是指允许接收cookie
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response1 = (HttpServletResponse) response;
response1.setHeader("Access-Control-Allow-Credentials", "true");
response1.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response1.setHeader("Access-Control-Max-Age", "3600");
response1.setHeader("Access-Control-Allow-Headers", "x-requested-with");
response1.setHeader("Access-Control-Allow-Origin", "http://localhost:8080");
chain.doFilter(request, response1);
}
- 在前端上传文件中,因为是plupload组件,所以没有办法使用axios中的axios.defaults.withCredentials=
true
; - Plupload 在这种跨域、同时是POST的情况下,是没办法发送身份凭证信息的,那么问题就来了,如果相关后端接口需要对用户权限进行判断(例如根据用户权限控制是否允许用户上传),那该如何是好?
- 方案一:通过参数传递PHPSESSID
通过 Javascript 获取 Cookies 中的 PHPSESSID
通过 Request Body 或者 Request Params 将 PHPSESSID 传入服务端,服务端再切换当前会话
- 方案二:在CROS请求中携带Cookies
可以基于 HTTP cookies 和 HTTP 认证信息发送身份凭证。
利用这个特性,即可解决文章开头所述的问题,至于Browser和Server只需要控制一下各自响应头即可
<uploader
browse_button="browse_button"
:url="server_config.url+'/file/uploadFile'"
:multi_selection="false"
:required_features="{send_browser_cookies: true}"
:FilesAdded="filesAdded"
:filters="{
mime_types : [
{ title : 'Image files', extensions : 'jpg,gif,png' },
{ title : 'Zip files', extensions : 'zip' }
],
max_file_size : '400kb'
}"
/>
关键点就是required_features="{send_browser_cookies: true}
注意事项
- **对于附带身份凭证的请求,服务器不得设置 Access-Control-Allow-Origin 的值为 *。**这是因为请求的首部中携带了 Cookie 信息,如果
Access-Control-Allow-Origin
的值为*
,请求将会失败。而将Access-Control-Allow-Origin
的值设置为http://localhost:8080
,则请求将成功执行。
参考
https://blog.richex.cn/519.html