热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java遇见HTML——JSP篇之JSP状态管理

一、http协议的无状态无状态性是指,当浏览器发送请求给服务器的时候,服务器响应客户端请求。但是当同一个浏览器再次发送请求给服务器的时候,

一、http协议的无状态

无状态性是指,当浏览器发送请求给服务器的时候,服务器响应客户端请求。
但是当同一个浏览器再次发送请求给服务器的时候,服务器并不知道他就是刚才的那个浏览器。
简单的说,就是服务器不会去记得你,所以就是无状态协议。

既然http是一种无状态的传输协议,无法记录用户的状态,就要想办法保存用户的状态。

那么,如何保护用户状态呢?

保护用户状态的两大机制:

第一种方法:用JSP的九大内置对象之一Session。

第二种:就是一种客户端技术:COOKIE

二、COOKIE概述  

COOKIE:中文名称为“小甜饼”,是Web服务器保存在客户端的一系列文本信息。

COOKIE的作用

  • 对特定对象的追踪
  • 保存用户网页浏览记录与习惯
  • 监护登录

安全风险:容易泄露用户信息。

三、JSP页面中创建与使用COOKIE

常用方法:

注意:getValue()和setValue()返回或者传参都是字符串类型,因为上面已经说过COOKIE是“Web服务器保存在客户端的一系列文本信息”,是以文本文件形式保存在客户端的。保存的COOKIE对象从本质而言就是字符串,所以在赋值或者取值的时候添加的参数以及获取到的值都是字符串类型。

四、案例:COOKIE在登录中的应用

 代码:

login.jsp

1 <%&#64;page import&#61;"java.net.URLDecoder"%>
2 <%&#64; page language&#61;"java" import&#61;"java.util.*" pageEncoding&#61;"utf-8"%>
3 <%
4 String path &#61; request.getContextPath();
5 String basePath &#61; request.getScheme()&#43;"://"&#43;request.getServerName()&#43;":"&#43;request.getServerPort()&#43;path&#43;"/";
6 %>
7
8 DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
9 <html>
10 <head>
11 <base href&#61;"<%&#61;basePath%>">
12
13 <title>My JSP &#39;index.jsp&#39; starting pagetitle>
14 <meta http-equiv&#61;"pragma" content&#61;"no-cache">
15 <meta http-equiv&#61;"cache-control" content&#61;"no-cache">
16 <meta http-equiv&#61;"expires" content&#61;"0">
17 <meta http-equiv&#61;"keywords" content&#61;"keyword1,keyword2,keyword3">
18 <meta http-equiv&#61;"description" content&#61;"This is my page">
19
22 head>
23
24 <body>
25 <%
26 request.setCharacterEncoding("utf-8");
27 String userName&#61;"";
28 String passWord&#61;"";
29 COOKIE[] COOKIEs&#61;request.getCOOKIEs();
30 if(COOKIEs !&#61;null && COOKIEs.length>0){
31 for(COOKIE c:COOKIEs){
32 if(c.getName().equals("userName")){
33 userName&#61;URLDecoder.decode(c.getValue(), "utf-8");//URLDecoder解码
34 }
35 if(c.getName().equals("passWord")){
36 passWord&#61;URLDecoder.decode(c.getValue(), "utf-8");//URLDecoder解码
37 }
38 }
39 }
40 %>
41 <form name&#61;"loginForm" action&#61;"doLogin.jsp" method&#61;"post">
42 <table>
43 <tr>
44 <td>用户名&#xff1a;td>
45 <td><input type&#61;"text" name&#61;"userName" value&#61;"<%&#61;userName%>">td>
46 tr>
47 <tr>
48 <td>密码&#xff1a;td>
49 <td><input type&#61;"password" name&#61;"passWord" value&#61;"<%&#61;passWord %>">td>
50 tr>
51 <tr>
52 <td colspan&#61;"2"><input type&#61;"checkbox" name&#61;"isUseCOOKIE" checked&#61;"checked">十天记住我的登录状态td>
53 tr>
54 <tr>
55 <td align&#61;"center"><input type&#61;"submit" value&#61;"登录">td>
56 <td align&#61;"center"><input type&#61;"reset" value&#61;"取消">td>
57 tr>
58 table>
59 form>
60 body>
61 html>

View Code

doLogin.jsp

1 <%&#64;page import&#61;"java.net.URLEncoder"%>
2 <%&#64; page language&#61;"java" import&#61;"java.util.*" pageEncoding&#61;"UTF-8"%>
3 <%
4 String path &#61; request.getContextPath();
5 String basePath &#61; request.getScheme()&#43;"://"&#43;request.getServerName()&#43;":"&#43;request.getServerPort()&#43;path&#43;"/";
6 %>
7
8 DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
9 <html>
10 <head>
11 <base href&#61;"<%&#61;basePath%>">
12
13 <title>My JSP &#39;doLogin.jsp&#39; starting pagetitle>
14
15 <meta http-equiv&#61;"pragma" content&#61;"no-cache">
16 <meta http-equiv&#61;"cache-control" content&#61;"no-cache">
17 <meta http-equiv&#61;"expires" content&#61;"0">
18 <meta http-equiv&#61;"keywords" content&#61;"keyword1,keyword2,keyword3">
19 <meta http-equiv&#61;"description" content&#61;"This is my page">
20
23
24 head>
25
26 <body>
27 <h1>登陆成功&#xff01;h1>
28 <br>
29 <br>
30 <%
31 request.setCharacterEncoding("utf-8");//
32 //首先判断用户是否选择了记住登录状态
33 String[] isUseCOOKIE&#61;request.getParameterValues("isUseCOOKIE");
34 if(isUseCOOKIE !&#61;null && isUseCOOKIE.length>0){
35 //把用户名和密码保存在COOKIE对象里
36 /* String userName&#61;request.getParameter("userName");//如果输入中文后台会报错,需要加上①②
37 String passWord&#61;request.getParameter("passWord"); */
38 //使用URLEncoder解决无法在COOKIE当中保存中文字符串的问题
39 String userName&#61;URLEncoder.encode(request.getParameter("userName"), "utf-8");//
40 String passWord&#61;URLEncoder.encode(request.getParameter("passWord"),"utf-8");
41 COOKIE userNameCOOKIE&#61;new COOKIE("userName",userName);
42 COOKIE passWordCOOKIE&#61;new COOKIE("passWord",passWord);
43 userNameCOOKIE.setMaxAge(864000);
44 passWordCOOKIE.setMaxAge(864000);//设置最大生存期限为10天
45 response.addCOOKIE(userNameCOOKIE);
46 response.addCOOKIE(passWordCOOKIE);
47 }else{
48 COOKIE[] COOKIEs&#61;request.getCOOKIEs();
49 if(COOKIEs !&#61;null && COOKIEs.length>0){
50 for(COOKIE c:COOKIEs){
51 if(c.getName().equals("userName") || c.getName().equals("passWord")){
52 c.setMaxAge(0);//设置COOKIE失效
53 response.addCOOKIE(c);//重新保存
54 }
55 }
56 }
57 }
58 %>
59 <a href&#61;"user.jsp" target&#61;"_blank">查看用户信息a>
60 body>
61 html>

View Code

user.jsp

1 <%&#64;page import&#61;"java.net.URLDecoder"%>
2 <%&#64;page import&#61;"java.net.URLEncoder"%>
3 <%&#64; page language&#61;"java" import&#61;"java.util.*" pageEncoding&#61;"UTF-8"%>
4 <%
5 String path &#61; request.getContextPath();
6 String basePath &#61; request.getScheme()&#43;"://"&#43;request.getServerName()&#43;":"&#43;request.getServerPort()&#43;path&#43;"/";
7 %>
8
9 DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
10 <html>
11 <head>
12 <base href&#61;"<%&#61;basePath%>">
13
14 <title>My JSP &#39;user.jsp&#39; starting pagetitle>
15
16 <meta http-equiv&#61;"pragma" content&#61;"no-cache">
17 <meta http-equiv&#61;"cache-control" content&#61;"no-cache">
18 <meta http-equiv&#61;"expires" content&#61;"0">
19 <meta http-equiv&#61;"keywords" content&#61;"keyword1,keyword2,keyword3">
20 <meta http-equiv&#61;"description" content&#61;"This is my page">
21
24
25 head>
26
27 <body>
28 <h1>用户信息h1>
29 <hr>
30 <br>
31 <br>
32 <%
33 request.setCharacterEncoding("utf-8");
34 String userName&#61;"";
35 String passWord&#61;"";
36 COOKIE[] COOKIEs&#61;request.getCOOKIEs();
37 if(COOKIEs !&#61;null && COOKIEs.length>0){
38 for(COOKIE c:COOKIEs){
39 if(c.getName().equals("userName")){
40 /* userName&#61;c.getValue(); */
41 userName&#61;URLDecoder.decode(c.getValue(), "utf-8");//URLDecoder解码
42 }
43 if(c.getName().equals("passWord")){
44 /* passWord&#61;c.getValue(); */
45 passWord&#61;URLDecoder.decode(c.getValue(), "utf-8");
46 }
47 }
48 }
49 %>
50 用户名&#xff1a;<%&#61;userName %><br>
51 密码&#xff1a;<%&#61;passWord %><br>
52 body>
53 html>

View Code

运行结果&#xff1a;

具体分析&#xff1a;

1、在login.jsp中使用checkbox来记录用户是否需要保存COOKIEs
2
、在dologin页面进行COOKIEs是否需要被保存的判定。
&#xff08;1&#xff09;通过request.getParamter()获取填写的用户名和密码&#xff1b;
&#xff08;2&#xff09;将获取的用户名和密码保存在COOKIE中&#xff1b;
COOKIE usernameCOOKIE &#61; new COOKIE("username",username); [
键值对形式]
......
&#xff08;3&#xff09;将COOKIE保存在浏览器中。
使用response.addCOOKIE(usernameCOOKIE);
同时设置COOKIE的有效期&#xff1a;
使用usernameCOOKIE.setMaxAge(648000); [单位为秒]

3
、在登录成功后的用户界面调用COOKIE显示用户名和密码。&#xff08;将客户端保存的COOKIE保存在数组中&#xff0c;然后赋值给字符串后用来输出显示&#xff09;
4
、保存中文COOKIE需要进行编码和解码&#xff0c;需要引入javanet包。&#xff08;添加COOKIE时编码URLEncode&#xff0c;读取COOKIE后解码URLDecode&#xff09;
for(COOKIE c:COOKIEs)
{
if(c.getName().equals("username"))
{
username &#61; URLDecoder.decode(c.getValue(),"utf-8");
}
if(c.getName().equals("password"))
{
password &#61; URLDecoder.decode(c.getValue(),"utf-8");
}
}

ps:java.net包中&#xff1a;
URLEncoder.encode();
字符编码工具类
URLDecoder.decode();
字符解码工具类

 

COOKIE在登录过程中出现的乱码问题解决方式
a:
在对应页面中导入java.net.*包&#xff0c;并将相应的字符用转码URLEncode.encode&#xff08;String&#xff0c;要转的编码&#xff09;
b.
在对应页面中导入java.net.*包&#xff0c;并将相应的字符用编码解码URLDecode.decode(String ,解码用的编码)

五、Session与COOKIE的对比

即&#xff1a;

1、保存位置&#xff1a;session在服务器端内存&#xff0c;COOKIE在客户端文本
2
、保存对象&#xff1a;session保存Object类&#xff0c;COOKIE保存String
3
、生存权&#xff1a;session会话结束即销毁&#xff0c;COOKIE可以长期保存在客户端
4
、重要性&#xff1a;session安全性更高&#xff0c;保存重要信息&#xff0c;COOKIE保存不重要的信息

ps:

COOKIE中对保存对象的大小是有限制的.Session可以保存任意大小的的对象类型。



推荐阅读
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 本文由编程笔记小编整理,主要介绍了使用Junit和黄瓜进行自动化测试中步骤缺失的问题。文章首先介绍了使用cucumber和Junit创建Runner类的代码,然后详细说明了黄瓜功能中的步骤和Steps类的实现。本文对于需要使用Junit和黄瓜进行自动化测试的开发者具有一定的参考价值。摘要长度:187字。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • JavaWeb中读取文件资源的路径问题及解决方法
    在JavaWeb开发中,读取文件资源的路径是一个常见的问题。本文介绍了使用绝对路径和相对路径两种方法来解决这个问题,并给出了相应的代码示例。同时,还讨论了使用绝对路径的优缺点,以及如何正确使用相对路径来读取文件。通过本文的学习,读者可以掌握在JavaWeb中正确找到和读取文件资源的方法。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • 微信商户扫码支付 java开发 [从零开发]
    这个教程可以用作了解扫码支付的整体运行过程,已经实现了前端扫码,记录订单,回调等一套完整的微信扫码支付。相关链接:微信支 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 一、新建登录名1.在登录名右侧的文本框中输入新建的管理员账号名称;2.一对单选按钮组中,选择SqlServer身份验证,并输入登录密码;3.勾选强制实施密码策略复选框;(密码策略一 ... [详细]
author-avatar
盎然茗嘉
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有