session、cookie
其他组件:
浏览器(pc网站):
萌工具箱不关心你是谁,计算器不需要知道那你自己,huxiu,好奇
Cookie:
再次访问某一网站时,能令网站识别访问人的计算机软件。
Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息。
每次HTTP请求时,客户端都会发送相应的Cookie信息到服务端。它的过期时间可以任意设置,如果你不主动清除它,在很长一段时间里面都可以保留着,即便这之间你把电脑关机了。
- cookie
- 概念:保存在客户端的一段小文本,会随着请求发回给服务器
- API
- new Cookie(name,value)
- setMaxAge(int age) => -1 表示浏览器关闭时销毁Cookie
- response.addCookie©;
- Cookie[] cookies = request.getCookies();
case ???:
if (autologin != null && autologin.equals("true")) {
Cookie namecookie = new Cookie("username", user.getUsername());
Cookie pwdcookie = new Cookie("passwd", user.getPwd());
//username和passwor都保存在cookie上
namecookie.setMaxAge(ONE_DAY);
pwdcookie.setMaxAge(ONE_DAY);
//设置cookie的存活时间
response.addCookie(namecookie);
response.addCookie(pwdcookie);
//将cookie保存在浏览器上
//cookie一系列的操作
}
<!--解释jsp,这个注释会被保留,
cookie页面上的直接跳转,如果cookie有值,那么直接跳转到登录页面
-->
<%
Cookie[] cookies = request.getCookies();
String username = null;
String passwd = null;
if(cookies!=null&&cookies.length>2){
System.out.println("cookie有三个以上");
for (Cookie c : cookies)
{//取的cookie
//System.out.println("cookie" + c.getValue());
if (c.getName().equals("username"))
username = c.getValue();
if (c.getName().equals("passwd"))
passwd = c.getValue();
System.out.println("username" + username + " " + passwd+"index.jsp/66行");
}
//input标签的name
if (username != null && passwd != null && username != "" && passwd != "") {
request.setAttribute("username", username);
request.setAttribute("password", passwd);
request.getRequestDispatcher("/login").forward(request, response);
return;
}}
%>
- form中增加autologin标识
- 登录成功,添加cookie
- index.jsp 获取cookie,验证是否存在,存在则转发给LoginServlet
- LoginServlet增加从Attribute中获取数据的方法
Session
会话跟踪:告诉服务器我是谁,使用session
Session是在无状态的HTTP协议下,***服务端***记录用户状态时用于标识具体用户的机制。
可以保存在文件、数据库或者集群中。在***浏览器关闭***后这次的Session就消失了,
其实并不是Session消失了,而是Session ID变了,只是他们是无主状态,也许一段时间后会被删除.
实际上Cookie与Session都是会话的一种方式。
目前大多数的应用都是用 Cookie 实现Session跟踪的。
第一次创建Session时,服务端会通过在HTTP协议中反馈到客户端,需要在 Cookie 中记录一个Session ID,以便今后每次请求时都可分辨你是谁。
- session的概念及实现原理
- 获取session
- 属性操作
- 使session失效
//创建session,使用
HttpSession session = request.getSession();
session.setAttribute("userinfo", user);
request.getRequestDispatcher("hello.jsp").forward(request, response);
//使用
Object obj = session.getAttribute("userinfo");
if(user!=null){
User user=(User)obj;
}
//或
<%-- 这种注释方式是不会被解释的
<div style="">
<c:if test="${sessionScope.userinfo.username!=null }">
<a href="logout"> 欢迎:${sessionScope.userinfo.username}
</a>
</c:if>
</div>
简单点: ${userinfo.username}
--%>
- session
- 概念:多次关联的请求组成了一次会话
- 实现原理:
- 第一次请求,开辟内存,生成sessionId, 生成一个名为JSESSIONID的cookie,保存sessionId到客户端
- 后续请求将携带JSESSIONID的cookie给服务器,服务器据此定位到相应的内存空间
- 当cookie失效或者服务器端session过期时,会话结束
- API
- HttpSession session = request.getSession()
- setAttribute(k,v) / getAttribute(K) / removeAttribute(k)
- invalidate 关闭session
- setMaxinactiveInterval 设置最大失效时间
总结语:
1、Cookie 在客户端(浏览器),Session 在服务器端。
2、Cookie的安全性一般,他人可通过分析存放在本地的Cookie并进行Cookie欺骗。在安全性第一的前提下,选择Session更优。重要交互信息比如权限等就要放在Session中,一般的信息记录放Cookie就好了。
3、单个Cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个Cookie。
4、Session 可以放在 文件、数据库或内存中,比如在使用Node时将Session保存在redis中。由于一定时间内它是保存在服务器上的,当访问增多时,会较大地占用服务器的性能。考虑到减轻服务器性能方面,应当适时使用Cookie。
5、Session 的运行依赖Session ID,而 Session ID 是存在 Cookie 中的,也就是说,如果浏览器禁用了 Cookie,Session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 Session ID)。
6、用户验证这种场合一般会用 Session。因此,维持一个会话的核心就是客户端的唯一标识,即Session ID。
request的方法
- getParameter /getParameterMaps
- get/setAttribute
- getSession 得到session
- getServletContext 得到上下文
- getContextPath 得到上下文路径
- getRequestDispatcher 得到转发器
- getRequestURI 请求路径 /emall/user
- getRequestURL 请求地址: http://localhost:8080/emall/user
- getRemoteAddr ip地址
- getCookies
Filter:我一般用来解决字符编码的问题
- 拦截指定的请求,并进行处理,适用于通用的功能,例如设置编码
- 编写步骤
- 新建Java类实现Filter接口
- 实现3个方法(doFilter)
- 调用filterChain.doFilter(request,response)
- web.xml注册
- filter
- filter-class : 全路径
- filter-mapping
- url-pattern
- filter
题外话,那么话说Session Cookie能被篡改么?
理论上可以,只要改变了连接时的Session ID 就可以了~
什么是session什么是cookie:
他人博客: