Java Web中Session和Cookie的区别,看这一篇就够了
文章目录
引文
会话跟踪技术是用来跟踪用户的会话,并且保持对用户会话之间的数据管理。其中常用的会话跟踪技术是Cookie
和Session
1、Cookie
Cookie
是客户顿请求服务器端后,服务器给客户端的一个标识,并保存在客户端中。
当客户端再次向服务器端发送请求时,会携带该标识,服务器就可以根据标识来识别客户端的身份或者状态。
1.1Cookie的应用
1.保持用户登录状态
将用户信息保存到Cookie中,并发送到浏览器中。将有效时间设置为一个较长的时间,这样子下次浏览器在进行访问一个网站时,服务器还能根据标识来识别用户。根据识别用户,用户就不需要输入用户名和密码等信息。
2.记录用户名
⼀旦⽤户登录成功以后,下次再登录时,直接将Cookie中的⽤户名读取并显示出来,这样⽤户就不需要再次输⼊⽤户名,只输⼊密码即可。
[举例1] Cookie保持登录信息状态&删除Cookie**
1.首先在重写的post方法中创建Cookie对象。根据对象与信息的匹配处理,返回到JSP页面进行响应。
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1、输出信息。
req.setCharacterEncoding("utf-8");
String uname=req.getParameter("username");
String upass=req.getParameter("password");
System.out.println(uname+": "+upass);
if ("小艾扶".equals(uname)&&"123".equals(upass)){
//登陆成功
System.out.println(uname+": "+upass);
resp.sendRedirect("success.jsp");
}
else{
//1.创建cookie对象
Cookie cookie = new Cookie("un",uname);
//2.设置Cookie的有效时间。当前时间为0.进行如上举例时要切记删掉。
cookie.setMaxAge(0);
//3.返回给前端
resp.addCookie(cookie);
resp.sendRedirect("index.jsp");
}
}
- 上面重写的是
doPost
方法,因为在进行登录注册时候,对信息是较为保密的状态。进行post
对安全性更加严谨。doGet
方法可以仍意补充。 - 后续在创建
cookie
对象时,需要声明好进行标识的地方(例如我上面只标识了账号名)。声明之后进行返回给前端进行响应。 - 如果需要进行删除Cookie时,将第16行代码加上~。
2.其次在项目中的index.jsp
中将响应回来的cookie对象进行处理,并显示于前端的界面中。
<body>
<%
Cookie[] cookies = request.getCookies();
String value="";
if(cookies.length>0){
//先判断里面是否有内容
for (Cookie cookie:cookies){
if (cookie.getName().equals("un")){
value=cookie.getValue();
break;
}
}
pageContext.setAttribute("unamecookie",value);
}
%>
<form action="login" method="post">
登录:<input type="text" name="username" value="${unamecookie}"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="提交">
</form>
</body>
- 首先写入一个
<form>
表单,它将模拟一个登录的简单功能。 - 在
<%%>
中填下如上代码。首先是获取java文件中获取cookie信息,对长度进行判断(如果为空的时候,直接进入for循环会有报错的现象呢!)。 - 可以进行存值操作,也可以设置一个全局变量直接进行传参并在登录的
<input>
中添加value
值。
最后会发现登陆之后返回,账号名会自动出现在上面哟~
1.2 Cookie的有效时间
- Cookie发送给浏览器以后,浏览器并不会永久保存,也就是到了⼀定的时间以后浏览器会⾃动销毁 Cookie。Cookie的默认有效时间为⼀次会话(⼀次打开关闭浏览器的过程)
- 同样的如上例子一样,我们可以⼿动指定Cookie的有效时间
//setMaxAge⽤来设置Cookie的最⼤有效时间,需要int型的参数,代表有效的秒数
cookie.setMaxAge(秒数);
//当参数⼤于0时,会设置为指定的秒数
cookie.setMaxAge(30);
//当参数等于0时,浏览器不会保存Cookie,Cookie⽴即失效
cookie.setMaxAge(0);
//当参数⼩于0时,和不设置是⼀样,当前会话有效
cookie.setMaxAge(-100);
//设置⼀个永久有效的Cookie,并⾮永久,只是使Cookie的⽣命很⻓⽽已
cookie.setMaxAge(60*60*24*365*10);
2、Session
在前面的学习中知道,Session主要进行的是会话的机制。但与此同时,Session是另一种记录客户状态的机制。
- Session主要保存在服务器中而非像Cookie存放在客户端浏览器中。
- 客户端浏览器访问服务器的时候,服务器将客户端信息以某种形式记录在服务器上,这就是Session。
如果说Cookie机制是通过检查客户身上的“通⾏证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建⽴的⼀份客户档案,客户来 访的时候只需要查询客户档案表就可以了。
2.1 创建Session的格式
对于Session
而言,它对应的类是为javax.servlet.http.HttpSession
类。每个来访者对应⼀个Session
对象,所有该客户的状态信息都保存在这个Session
对象⾥。Session
对象是在客户端第⼀次请求服务器的时候创建的。
Session
也是⼀种**key-value
的属性对**,通过getAttribute(Stringkey)
和setAttribute(String key, Objectvalue)
⽅法读写客户状态信息。Servlet
⾥通过request.getSession()
⽅法获取该客户的Session
HttpSession session = request.getSession(); // 获取Session对象
session.setAttribute("loginTime", new Date()); // 设置Session中的属性
out.println("登录时间为:" +(Date)session.getAttribute("loginTime")); // 获取(将其转换为Data对象进行获取时间)
//Session属性
2.2 Session的生命周期
- 前面介绍到,Session保存在服务器端。但是为了获得更高的存取速率,服务器一般将
Session
放在内存中。每一个用户都有一个独立的Session
。 - 如果
Session
内容过于繁多,则容易造成内存溢出。 - 因此在进行Session应用是时更多将其信息言简意赅。
生命周期步骤如下:
- 首先在进行第一次访问时,服务器会自动创建Session。(只有访问JSP、Servlet等程序时才会创建 Session,只访问HTML、IMAGE等静态资源并不会创建Session。如果尚未⽣成Session,也可以使 request.getSession(true)强制⽣成Session。)
- 由于越来越多的用户进行访问,Session会越来越多。
- 为了防止内存溢出,服务器会将长时间没有活跃的session将内存中删除。这就是session的超时时间。如果超过该超时时间没有访问服务器,那么Session就会自动失效。
2.3 Session的常用方法
如上所示,这些都是Session的常用方法。
3、Cookie和Session的区别
Cookie
数据保存在客户端,Session数据保存在服务器端。Session
是由应⽤服务器维持的⼀个服务器端的存储空间,⽤户在连接服务器时,会由服务器⽣成⼀个唯⼀的SessionID,⽤该SessionID 为标识符来存取服务器端的Session存储空间。⽽SessionID这⼀数据则是保存到客户端,⽤Cookie保存的,⽤户提交⻚⾯时,会将这⼀SessionID提交到服务器端,来存取 Session数据。这⼀过程,是不⽤开发⼈员⼲预的。所以⼀旦客户端禁⽤Cookie,那么Session也会失效。- Cookies是属于Session对象的⼀种。但有不同,Cookies不会占服务器资源,是存在客服端内存或者⼀个Cookie的⽂本⽂件中;⽽Session则会占⽤服务器资源。所以,尽量不要使⽤Session,⽽使⽤ Cookies。但是我们⼀般认为Cookie是不可靠的,Cookies是保存在本机上的,但是其信息的完全可⻅性且易于本地编辑性,往往可以引起很多的安全问题Session是可靠地。但是⽬前很多著名的站点也都⽤Cookie。
4、过滤器
4.1 过滤器的基本概念
过滤器就是对web资源进⾏拦截,通过做⼀些处理后再交给下⼀个过滤器或servlet
处理,通常都是⽤来拦截request
进⾏处理的,也可以对返回的response
进⾏拦截处理。
4.2 过滤器的语法格式
1.创建一个类,实现Filter
接口。
public class CharSetFilter implements Filter{}
2.重写接口中的方法
public void destroy() { //销毁的⽅法}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain
chain) throws ServletException, IOException {
//过滤⽅法 主要是对request和response进⾏⼀些处理,然后交给下⼀个过滤器或
Servlet处理
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
/*初始化⽅法 接收⼀个FilterConfig类型的参数 该参数是对Filter的⼀些配置*/
}
3.在web.xml
中进行设置
<filter>
<filter-name>过滤器名称</filter-name>
<filter-class>过滤器所在的路径</filter-class>
</filter>
<filter-mapping>
<filter-name>过滤器名称</filter-name>
<url-pattern>需要过滤的资源</url-pattern>
</filter-mapping>
4.3 使用场景
1.如何防⽌⽤户未登录就执⾏后续操作
String name=(String)session.getAttribute("key");
if(name==null){
//跳转到登录⻚⾯
}
2.设置编码⽅式–统⼀设置编码
3.加密解密(密码的加密和解密)
4.⾮法⽂字筛选
5.下载资源的限制
过滤器的特点:在servlet之前和之后都会被执⾏
5、监听器
监听就是在监听某个域对象的状态变化的一个组件。
5.1 监听器的相关概念:
- 事件源:被监听的对象(三个域对象 request、session、servletContext)
- 监听器:监听事件源对象事件源对象的状态的变化都会触发监听器
- 注册监听器:将监听器与事件源进⾏绑定
- 响应⾏为:监听器监听到事件源的状态变化时所涉及的功能代码(程序员编写代码)
5.2 监听器分类
- 横轴按照被监听的对象划分:ServletRequest域、HttpSession域、ServletContext域
- 纵轴按照监听的内容分:监听域对象的创建与销毁、监听域对象的属性变化
5.3 监听三大域对象的创建与销毁
监听器的编写步骤(重点)
- 编写⼀个监听器类去实现监听器接⼝
- 覆盖监听器的⽅法
- 需要在web.xml中进⾏配置—注册
对象 | 作用 | 生命周期 |
---|---|---|
ServletContextListener | 监听ServletContext 域的创建与销毁的监听器 | 创建:服务器启动创建 删除:服务器关闭 |
HttpServletListener | 监听HttpServietListener 域的创建和销毁的监听器 | 创建:第一次调用request.gerSession 方法时创建销毁:服务器关闭销毁, Session 过期 |
ServletRequestListener | 监听ServletRequest 域的创建与销毁的监听器 | 创建:每一次创建时会调用一次request 。销毁:请求关闭 |
ServletContextListener
的作用:
- 初始化工作:初始化对象、数据
- 加载初始化的一些配置文件(spring配置文件)
- 任务调度(定时器—Timer/TimerTask)
HttpServletListener
的作用:
默认创建Session下,可以统计网站访问的用户。
总结
以上就是针对Cookie和Session的全部内容。这里稍微查阅翻阅资料,但是还请大家认真阅读。谢谢大家的阅读。