《Java从入门到放弃》JSP入门篇:状态管理

news/2024/5/18 14:12:20 标签: jsp状态管理, cookie, session, application

web程序常用的数据管理有三个类,Cookie,Session和Application。

Cookie:数据存在客户端,安全性差,可以设置过期时间,在时间周期内数据一直有效。

Session:数据存在服务器,每一个浏览器占用一个单独的Session,默认过的期时间20分钟,浏览器关闭后Session数据清空。

Application:数据存在服务器端,所有用户共享该数据。

 

下面通过几个常用功能来演示这三个类的使用。

第一个功能:登录状态保存(Cookie)

功能描述:有两个页面,登录和个人中心。第一次访问登录页面时,如上图所示。如果勾选了“10天内自动登录”,则10天内可以直接访问个人中心,否则访问个人中心时会跳转到登录页面。

先完成基本登录功能,再完成10天内自动登录功能

一、基本登录功能实现步骤:

1.创建login.jsp和user.jsp页面。

2.编写login.jsp登录功能。

<form action="user.jsp" method="post">
    <label>账号:</label>
    <input type="text" id="txtLoginID" name="txtLoginID" /><br />
    <input type="password" id="txtLoginPWD" name="txtLoginPWD" /> <br />
    <input type="checkbox" id="chkSave" name="chkSave" value="true" />记住账号密码<br />
    <input type="submit" value="登录" />
</form>

3.登录后跳转到user.jsp页面,并显示账号名。

<body>
	<%
  		//一、读取从login.jsp页面传递过来的数据
  		String loginID = request.getParameter("txtLoginID");
		String loginPWD = request.getParameter("txtLoginPWD");
	  		
		if(loginID != null){
			response.getWriter().write("输入的账号是:"+loginID);
		  	response.getWriter().write("输入的密码是:"+loginPWD);	
		}
  	%>
</body>

二、10天内自动登录功能实现步骤:

 1. 修改login.jsp页面,如果Cookie中有用户信息,则直接跳转到用户页面。

<body>
<%
  	//1. 判断是否在Cookie保存过用户信息
  	Cookie[] cookies = request.getCookies();
  	if(cookies != null){
  		for(int i=0; i<cookies.length; i++){
  			//2. 如果有则跳转到用户页面
  			if(cookies[i].getName().equals("loginID")){
  				response.sendRedirect("user.jsp");
  			}
  		}
  	}
%>
    <form action="user.jsp" method="get">
	    <label>账号:</label>
	    <input type="text" id="txtLoginID" name="txtLoginID" /><br />
	    <label>密码:</label>
	    <input type="password" id="txtLoginPWD" name="txtLoginPWD"/><br />
	    <input type="checkbox" id="chkSave" name="chkSave" value="true" />记住账号密码<br />
	    <input type="submit" value="登录" />
    </form>
</body>

 二、修改user.jsp代码,将用户的登录信息保存到Cookie中。

<body>
    <%
        request.setCharacterEncoding("utf-8");
        //一、如果是已保存到Cookie,则直接读取数据
        String loginID = null;
        //1. 判断是否在Cookie保存过用户信息
        Cookie[] cookies = request.getCookies();
        if(cookies != null){
            for(int i=0; i<cookies.length; i++){
                //2. 如果有则存到变量
                if(cookies[i].getName().equals("loginID")){
                    loginID = cookies[i].getValue();
                    break;
                }
            }
        }
        //二、否则根据参数读取数据
        if(loginID == null){
            //1. 获取接收的数据
            String chkSave = request.getParameter("chkSave");
            loginID = request.getParameter("txtLoginID");
            if(chkSave != null){
                /* response.getWriter().write(chkSave); */
                //2. 如果选中,则把账号保存到Cookie
                Cookie loginIDCookie = new Cookie("loginID", loginID);
                loginIDCookie.setMaxAge(60);
                response.addCookie(loginIDCookie);
            }
        }
        //三、 登录成功显示账号信息,否则跳转到登录页面
        if(loginID != null){
            response.getWriter().write("输入的账号是:"+loginID);
            response.getWriter().write("输入的密码是:"+loginPWD);	
        }
        else{
            response.sendRedirect("login.jsp");
        }
  		  		
    %>
</body>

这样,一个简单的10天自动登录就完成了。主要使用Cookie来保存数据。


第二个功能:顶部用户中心显示效果(Session)

功能描述:未登录时显示,登录后显示个人信息

1. 新建blog.jsp页面,编写从Session读取数据的代码。

<body>
    <%
    String str = "<a href=\"login.jsp\">登录</a>&nbsp;<a href=\"#\">注册</a>";
    Object loginID = session.getAttribute("loginID");
    if(loginID != null){
        str = "<a href='#'>"+loginID+"</a>";
    }
    %>
    <div><%=str %></div>
</body>

2.修改user.jsp,加上将登录信息保存到Session的代码。

  <body>
    <%
    	String loginID = null;
    	String loginPWD = null;
    	loginID = request.getParameter("txtLoginID");
    	loginPWD = request.getParameter("txtLoginPWD");
    	//验证密码是否为123,正确则保存用户信息,否则回到登录功能,并返回错误信息
    	if(loginPWD.equals("123")){
    		session.setAttribute("loginID", loginID);
    	}
    	else{
    		session.setAttribute("err", "账号或密码错误!");
    		response.sendRedirect("login.jsp");
    	}
    %>
  </body>

这样,一个简单的登录状态显示效果就完成了。


第三个功能:显示所有在线用户(当前不考虑用户退出的情况)(Application)

1. 修改用户登录的代码,当用户登录成功后,将账号保存到集合,再将集合存到Application中。

  <body>
    <%
    	String loginID = null;
    	String loginPWD = null;
    	loginID = request.getParameter("txtLoginID");
    	loginPWD = request.getParameter("txtLoginPWD");
    	//验证密码是否为123,正确则保存用户信息,否则回到登录功能,并返回错误信息
    	if(loginPWD.equals("123")){
            session.setAttribute("loginID", loginID);
            //将当前登录用户保存到全局对象域
            List<String> list = (ArrayList<String>)application.getAttribute("userList");
            if(list == null){
            	list = new ArrayList<String>();
            }
            list.add(loginID);
            application.setAttribute("userList", list);
    	}
    	else{
    		session.setAttribute("err", "账号或密码错误!");
    		response.sendRedirect("login.jsp");
    	}
    %>
  </body>

2. 在blog.jsp页面显示所有在线用户。

<body>
    <%
    String str = "<a href=\"#\">登录</a>&nbsp;<a href=\"#\">注册</a>";
    Object loginID = session.getAttribute("loginID");
    if(loginID != null){
        str = "<a href='#'>"+loginID+"</a>";
    }
    %>
    <div><%=str %></div>
    <div>
        <p>所有在线用户:</p>
        <div>
        <%
            String userol = "";
            //显示所有在线用户
            List<String> list = (ArrayList<String>)application.getAttribute("userList");
            if(list != null){
                for(int i=0; i<list.size(); i++){
                    userol += list.get(i)+"<br />";
                }
            }
        %>
        <%=userol %>
        </div>
    </div>
</body>

3. 使用不同的浏览器登录,就能在blog.jsp页面看到所有在线用户了。


http://www.niftyadmin.cn/n/1780730.html

相关文章

Linux 小知识翻译 - 「代理服务器」

这回聊聊「代理服务器」。 在公司里&#xff0c;不通过代理服务器无法连接互联网的&#xff0c;由于代理服务器的原因&#xff0c;有些服务的使用是受到限制的。 有人可能会觉得为什么会存在这种东西&#xff1f;&#xff08;这里指代理服务器&#xff09; Proxy本来的意思是「…

Gradle学习系列之一——Gradle快速入门(转)

这是一个关于Gradle的学习系列&#xff0c;其中包含以下文章&#xff1a; Gradle快速入门创建Task的多种方法读懂Gradle语法增量式构建自定义Property使用java Plugin依赖管理构建多个Project自定义Task类型自定义Plugin请通过以下方式下载本系列文章的Github示例代码&#xff…

[cb]Unity 关卡编辑器 开发

关卡编辑器 关卡编辑器插件开发日记 1. Apply to Prefab [替换Prefab] if (GUILayout.Button("Apply Collider To Prefab")){PrefabUtility.ReplacePrefab(simActor.Preview, PrefabUtility.GetPrefabParent(simActor.Preview), ReplacePrefabOptions.ConnectToPrefa…

《Java从入门到放弃》JSP入门篇:EL和JSTL

EL即Expression Language&#xff08;表达式语言&#xff09;&#xff0c;主要用来替代JSP页面中用来做简单运算和显示的代码。EL表达式可以用来显示page、request、session和application中的数据。 EL表达式的语法非常简单&#xff1a; ${ EL exprission }&#xff0c;${ …

wget: unable to resolve host address的解决方法

2019独角兽企业重金招聘Python工程师标准>>> wget&#xff1a;无法解析主机地址。这就能看出是DNS解析的问题。 解决办法&#xff1a; 登入root&#xff08;VPS&#xff09;。进入/etc/resolv.conf。修改内容为下nameserver 8.8.8.8 #google域名服务器nameserver 8.…

《Java从入门到放弃》JSP入门篇:Serlvet入门

Servlet 是一个 Java程序&#xff0c;是在服务器上运行以处理客户端请求并做出响应的程序。 在web项目中创建Servlet的步骤如下&#xff1a; 1.在web项目src目录下的包上点右键&#xff0c;选择new->Servlet。 2. 编写Servlet类名&#xff0c;确定对应的方法&#xff1a; …

小心指针被delete两次

C类中&#xff0c;有时候使用到传值调用&#xff08;对象实体做参数&#xff09;&#xff0c;遇到这种情况&#xff0c;可要小心了&#xff01;特别是当你所传值的对象生命周期较长&#xff0c;而非临时对象&#xff08;生命周期段&#xff09;的时候。来看看下面的情况&#x…

一次一密加密、解密算法

1. 一次一密加密、解密算法 一次一密密码系统的一个重要特性是密钥K为一个真随机序列&#xff0c;且密钥只使用一次。 下面通过计算机的伪随机函数产生的随机序列作为密钥来简单演示一次一密的加密解密算法&#xff0c;代码示例如下&#xff1a; /*** 一次一密加密、解密算法* …