第十六天:跨域-cookie-session
跨域
这是个安全策略,只能我允许的域名才能访问
前后端分离
通过这样的方式后,我们的项目打不开,前端解析会出现问题,这就是跨域的问题
同源策略
浏览器有个同源策略(Same-Origin Policy)
- 它规定了:默认情况下,AJAX请求只能发送给同源的URL
- 同源是指3个相同:协议、域名(IP)、端口
但是img vidio等图片不受同源策略的影响
所以我们俩不同源,所以访问不到数据
当我们通过这样的方式去访问时,就是跨域访问,我们怎么去解决这个问题,这个就牵扯到了跨域资源共享问题
解决AJAX跨域请求的常用方法
-
CORS (cross-origin Resource Sharing),跨域资源共享
-
CORS的实现需要客户端和服务器同时支持
客户端
所有的浏览器都支持(IE至少是IE10版本)
服务器
- 需要返回相应的响应头(比如Access-Control-Allow-origin)
- 告知浏览器这是一个允许跨域访问的请求
服务器在别人设置CORS,允许别人能够跨域访问
允许这个http://localhost:7777 的域就能访问它
cookie
在客服端存储数据(浏览器)
服务器可以返回cookie交给客服端去存储
当浏览器登录成功后,服务器会用session存下用户数据,并向客服端返回一个cookieID让浏览器存下cookie。当浏览器再次请求/users URL地址,在请求中就会带上cookie字段,当服务器检测到cookie后,就会返回你要的数据
cookie作用域
domain和path标识定义了Cookie的作用域,即Cookie应该发送给哪些URLdomain
标识指定了哪些主机可以接受Cookie
如果不指定,默认为当前文档的主机(不包含子域名);如果指定了domain,则一般包含例如:如果设置domain=520it.com,则Cookie也包含在子域名中(如bbs.520it.cor
path
标识指定了主机下的哪些路径可以接受Cookie,子路径也会被匹配例如:设置path=/docs,则以下地址都会匹配
/docs
/ docs/one// docs/one/img
cookie只争对一个浏览器
Session
在服务器存储一些数据
服务器为了保存用户状态而创建的一个特殊的对象。
当浏览器第一次访问服务器时,服务器创建一个session对象(该
对象有一个唯一的id,一般称之为sessionId),服务器会将sessionId
以cookie的方式发送给浏览器。
当浏览器再次访问服务器时,会将sessionId发送过来,服务器依据
sessionId就可以找到对应的session对象。
如何获得session对象?
方式一 HttpSession s = request.getSession(boolean flag);
HttpSession是一个接口。
当flag为true时:
先查看请求当中是否有sessionId,如果没有,则创建一个session对象。如果有,则依据sessionId查找对应的session对象,如果找到了,则返回该对象,如果找不到,创建一个新的session对象。
当flag为false时:
先查找请求当中是否有sessionId,如果没有,返回null。如果有,则依据sessionId查找对应的session对象,如果找到了,则返回该对象,如果找不到,返回null。
Session 的销毁
为了避免Session中存储的数据过大,Session需要销毁:
-
超时自动销毁。
-
从用户最后一次访问网站开始,超过一定时间后,服务器自动销毁Session,以及保存在Session中的数据。
-
Tomcat 服务器默认的Session超时时间是30分钟
-
可以利用web.xml设置超时时间单位是分钟,设置为0表示不销毁。
20
-
-
调用API方法,主动销毁Session
session.invalidate()
public class DeleteServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
session.invalidate();
response.setContentType(
"text/html; charset=utf-8");
response.getWriter().println("呵呵!");
}
}