前后端交互跨域问题及cookie&session浅谈

一、交互跨域问题

跨域问题的原因:根据同源策略,浏览器不允许ajax访问当前源之外的资源即不同域名之间相互访问,是浏览器对js的安全限制。(eg:前端和后端部署的端口号不同,且没有相应的跨域请求处理)

同一个域:同一协议;同一ip;同一端口;

解决方法小结:规避同源策略

1.后端自定义filter,在请求头里面加上参数;

实现Filter接口,新建一个名为CORSFilter的Filter;注册过滤器;在应用启动类中添加@ServeletComponentScan注解,项目启动时自动扫描serclet组件(参考文末“实例”连接);

下面给出创建的filter:

package servlet;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//通过webfilter注册过滤器,给出过滤器名称和要被过滤的请求地址
@WebFilter(filterName = "/CORSFilter", urlPatterns = {"/*"})
public class CORSFilter implements Filter  {

    public CORSFilter() {}

    public void destroy() {}

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
        //允许跨域的主机地址
        httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
        //允许跨域的请求头
        httpServletResponse.setHeader("Access-Control-Allow-Headers", "*");
        //允许跨域的请求方法
        httpServletResponse.setHeader("Access-Control-Allow-Methods", "*");
        //是否允许携带cookkie
        httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true");
        //重新预检验跨域的缓存时间
        httpServletResponse.setHeader("Access-Control-Max-Age", "3600");
        
        chain.doFilter(httpServletRequest, httpServletResponse);
        
    }

    public void init(FilterConfig fConfig) throws ServletException {}

2.node服务器代理,将前端的请求通过node转发到后端,绕过跨域;(单独针对前端,无法处理端口和协议不同的情况)

3.CORS跨域资源共享

使用XMLHttpRequest对象,需要前后端http请求头一致。

更多XHR相关可以参考:https://blog.csdn.net/u013407012/article/details/93311096

用post方式进行Ajax请求:

var iris = new XMLHttpRequest();
iris.open("post","url","true");
//设置请求头(post方法需要自己设置)
iris.setRequestHeader("Content-Type","applcation/x-www-form-urlencode");
//发送数据
iris.send("name"+uaername);

CORS和Ajax的方法基本一致,把不同点在于open方法上,ajax使用的是相对路径,CORS使用的是完整路径。

更多细节讲解可以参考:https://www.ruanyifeng.com/blog/2016/04/cors.html

4.JSONP

没有CORS那么强大,只能支持GET请求,优势在于支持老服务器。但是不能解决不同域的两个页面之间的js调用问题。

运用src请求不同域,执行回调函数

①script标签引用:

<script>

function callbackData(jsondata){}

</script>

<script src='http://aaa.com/aaa.html?callback=callbackData'></script>

②jquery请求jsonp:

$.ajax({

    url:'http://aaa.com/aaa.html',

    dataType:'jsonp',

    jsonp:'jsonpcallback',

    success:function(data){

           //处理返回函数

    }

})

③vue-resource请求jsonp:

this.$http.jsonp('https://api.douban.com/v2/movie/top250?count=10',{},

{

       headers:{ },

       emulateJSON: true

}).then(

       function(response) {

       // 处理正确的回调

       },function(response) {

       // 处理错误的回调

});

5.flash插件

6.silverlight插件

7.document.domain跨子域

在各自的域中设置document.domain一致,可以实现跨域调用。设置时必须设置成自身或更高级的父域并且主域必须相同。

eg:http://www.aaa.com/a.html  与  http://aaa.com/b.html 是同一主域:aaa.com

8.window.name

9.HTML5的window.postMessage方法跨域

10.vue-proxytable服务器代理跨域

---以上是交互跨域的简单整理,待完善---

可以参考的博文:

后端方法:https://www.cnblogs.com/qintang/p/13821654.html 

https://www.cnblogs.com/wangwei0514/p/cors_.html

实例:https://blog.csdn.net/qq_38321137/article/details/113309117

前端方法:https://www.jianshu.com/p/b95813068827

https://www.ruanyifeng.com/blog/2016/04/cors.html

二、Cookie&Session简述

cookie和session都是跟踪浏览器的身份的会话方式,cookie像给用户通行证证明身份,session是通过id查找用户名单确认身份。

一个用户的所有操作都属于一个会话

cookie:

创建cookie: Cookie cookie = new Cookie("key","value");

cookie数据保存在客户端;服务器设置了cookie用户名,只要不关闭浏览器cookie变量一直有效,能保证长时间不掉线。

cookie被攻击的可能性比较大,最好不要保存登录等重要信息;

cookie过期时间可以在cookie生成的时候设置进去;

想要查看一个网站的cookie信息可以在浏览器地址栏输入javascript:alert(document.cookie);

cookie对象使用key-value属性对的形式保存用户状态,一个cookie对象保存一个cookie,一个request或者response同时使用多个Cookie。

cookie有不可跨域名性

cookie的常用属性:

属  性  名

描    述

String name

该Cookie的名称。Cookie一旦创建,名称便不可更改

Object value

该Cookie的值。如果值为Unicode字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64编码

int maxAge

该Cookie失效的时间,单位秒。如果为正数,则该Cookie在maxAge秒之后失效。如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为–1

boolean secure

该Cookie是否仅被使用安全协议传输。安全协议。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false

String path

该Cookie的使用路径。如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/”

String domain

可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”

String comment

该Cookie的用处说明。浏览器显示Cookie信息的时候显示该说明

int version

该Cookie使用的版本号。0表示遵循Netscape的Cookie规范,1表示遵循W3C的RFC 2109规范

session:

第1次访问服务器,getSession创建对话,第2次...第N次访问时若getSession()会话存在返回原来对话否则重新创建对话。(session对象默认存活30min)

session数据保存在服务器端;sessionIDh是服务器和客户端连接时随机分配的。

session过期时间取决于服务器是设定;

HttpSession常用的方法:

方  法  名

描    述

void setAttribute(String attribute, Object value)

设置Session属性。value参数可以为任何Java Object。通常为Java Bean。value信息不宜过大

String getAttribute(String attribute)

返回Session属性

Enumeration getAttributeNames()

返回Session中存在的属性名

void removeAttribute(String attribute)

移除Session属性

String getId()

返回Session的ID。该ID由服务器自动创建,不会重复

long getCreationTime()

返回Session的创建日期。返回类型为long,常被转化为Date类型,例如:Date createTime = new Date(session.get CreationTime())

long getLastAccessedTime()

返回Session的最后活跃时间。返回类型为long

int getMaxInactiveInterval()

返回Session的超时时间。单位为秒。超过该时间没有访问,服务器认为该Session失效

void setMaxInactiveInterval(int second)

设置Session的超时时间。单位为秒

void putValue(String attribute, Object value)

不推荐的方法。已经被setAttribute(String attribute, Object Value)替代

Object getValue(String attribute)

不被推荐的方法。已经被getAttribute(String attr)替代

boolean isNew()

返回该Session是否是新创建的

void invalidate()

使该Session失效

更详细的介绍参考博文:https://blog.csdn.net/gaoyong_stone/article/details/79524321

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值