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

网站用户存在状态的session用法及例子

问题?首先我们知道,在我们登录网站的时候,点击一个又一个链接,但是用户显示依然存在,这是为什么呢,

问题?首先我们知道,在我们登录网站的时候,点击一个又一个链接,但是用户显示依然存在,这是为什么呢,网站又是如何识别的呢?那怎么来做这个效果呢?接下来用一个例子及原理为大家说明。

原理:session的用法,当我们登陆验证成功后就在session中写一个标记,等点击链接的时候就会一直识别是否有这个标记。


HttpSession概述及原理探讨
得到HttpSession对象:
HttpServletRequest.getSession():根据特殊COOKIE(JSESSIONID=HttpSession对象的id,由服务器生成,唯一的)的取值,在服务器的内存中根据id查找这个HttpSession对象,找到了,取出来继续服务;没有找到,创建一个新的HttpSession对象。

第一步:建立jsp或者html页面

<%&#64; page language&#61;"java" import&#61;"java.util.*" pageEncoding&#61;"UTF-8"%>
<%
String path &#61; request.getContextPath();
String basePath &#61; request.getScheme()&#43;"://"&#43;request.getServerName()&#43;":"&#43;request.getServerPort()&#43;path&#43;"/";
%>
">
用 户 名&#xff1a;
密 码&#xff1a;
看不清


第二步&#xff1a;xml文件


day08IndexServletcom.dp.javaweb.login.IndexServletLandingServletcom.dp.javaweb.login.LandingServletLoginoutServletcom.dp.javaweb.login.LoginoutServletImageServletcom.dp.javaweb.login.ImageServletIndexServlet/servlet/IndexServletLandingServlet/servlet/LandingServletLoginoutServlet/servlet/LoginoutServletImageServlet/servlet/ImageServletLogin.jsp




第三步&#xff1a;画图验证码class类

package com.dp.javaweb.login;import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class ImageServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { //通知浏览器不要缓存response.setHeader("Expires", "-1");response.setHeader("Cache-Control", "no-cache");response.setHeader("Pragma", "-1");int height&#61;25;int width&#61;120;//得到一个内存图像BufferedImageBufferedImage img&#61;new BufferedImage(width, height, BufferedImage.TYPE_ INT_RGB);//得到一个画笔Graphics g&#61;img.getGraphics();//画边框drawRect绘制指定矩形的边框。g.drawRect(0, 0, width, height);//填充颜色g.setColor(Color.RED);g.fillRect(1, 1, width-2, height-2);//画干扰线g.setColor(Color.BLACK);Random r&#61;new Random();for(int i&#61;0;i<20;i&#43;&#43;)g.drawLine(r.nextInt(width), r.nextInt(height), r.nextInt(width), r.nextInt(height));//生成随机数字g.setColor(Color.BLUE);g.setFont(new Font("微软雅黑", Font.BOLD|Font.ITALIC, 20));//BOLD加粗&#xff0c;ITALIC斜体int d&#61;15;StringBuffer sb&#61;new StringBuffer();//可变字符串的利用for(int j&#61;0;j<4;j&#43;&#43;){String code&#61;r.nextInt(10)&#43;"";sb.append(code);g.drawString(code&#43;"", d, 20);d&#43;&#61;20;}//将验证码输入到session中&#xff0c;用来验证request.getSession().setAttribute("code", sb.toString());//输出打web页面ImageIO.write(img, "jpg", response.getOutputStream());}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}


第四步&#xff1a;处理用户密码验证码类(这里就开始利用session的作用&#xff0c;因为痛密码用户一样也在验证码出也写了一个session)

package com.dp.javaweb.login;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** 处理用户密码**/
public class LandingServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset&#61;UTF-8");PrintWriter out&#61;response.getWriter();//验证用户和密码String username&#61;request.getParameter("username");String password&#61;request.getParameter("password");String code&#61;request.getParameter("code");//得到session中的session验证码String sessuoncode&#61;(String)request.getSession().getAttribute("code");//验证验证码if(!code.equals(sessuoncode)){out.write("登陆失败&#xff0c;错误的验证码&#xff01;&#xff01;重新登录");return;//不往下执行了}StringBuffer sb&#61;new StringBuffer(password);password&#61;sb.reverse().toString();//reverse()将此字符序列用其反转形式取代if(username.equals(password)){User user&#61;new User();user.setUsername(username);user.setPassword(password);//在把user对象放入session中&#xff0c;有了标记&#xff0c;这点儿很重要。request.getSession().setAttribute("user", user);out.write("登陆成功&#xff0c;2秒后自动返回到主页面&#xff01;&#xff01;");}else{out.write("登陆失败&#xff0c;2秒钟后自动返回到主页面&#xff01;&#xff01;");}response.setHeader("Refresh","2;URL&#61;/day08/servlet/IndexServlet");}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}


第五步&#xff1a;验证session是否存在&#xff0c;并处理登陆状态

package com.dp.javaweb.login;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;/*** 验证session中用户和密码**/
public class IndexServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset&#61;UTF-8");PrintWriter out&#61;response.getWriter();HttpSession session&#61;request.getSession();//创建session对象User user&#61;(User)session.getAttribute("user");//得到标记//session.setMaxInactiveInterval(2);//setMaxInactiveInterval表示2秒内不对session做出操作&#xff0c;自动删除session//一般情况下&#xff0c;不用设置这个函数,因为getMaxInactiveInterval()的session的默认失效为1800毫秒也就是半分钟//System.out.println(session.getMaxInactiveInterval());//打印默认session存在时间if(user&#61;&#61;null){out.write("请登陆");}else{out.write("欢迎您&#xff1a;"&#43;user.getUsername()&#43;"    注销");}out.write("


");out.write("主页&#xff1a;");}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}


第六步&#xff1a;注销功能的实现&#xff0c;这个功能主要是将写入session的标记去除掉或者将域中的标记联系中断

package com.dp.javaweb.login;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;//去掉session中的登陆标记&#xff0c;也就是用于注销
public class LoginoutServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset&#61;UTF-8");request.setCharacterEncoding("UTF-8");PrintWriter out&#61;response.getWriter();request.getSession().removeAttribute("user");//删除了域中绑定的对象
// request.getSession().invalidate();//这是直接销毁session&#xff0c;可任选一种out.write("注销成功&#xff0c;2秒后自动转入主页。");response.setHeader("Refresh", "2;URL&#61;/day08/servlet/IndexServlet");}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}


第七步&#xff1a;封装用户密码的Bean类

package com.dp.javaweb.login;public class User {private String username;private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username &#61; username;}public String getPassword() {return password;}public void setPassword(String password) {this.password &#61; password;}}


结果显示&#xff1a;

        

第一种情况&#xff1a;验证码错误

       

第二种情况&#xff1a;用户密码错误

       

第三种情况&#xff1a;登陆成功后

                    

最后的注销就不用我说了吧&#xff01;就是去掉session的标记。


注意&#xff1a;session.setMaxInactiveInterval(30 * 60);//单位秒&#xff0c;这是设置网页中session在缓存中的存在时间
   如果不设置的话&#xff0c;session,默认过期时间为30分钟也就是1800秒&#xff0c;

    session时间的另外一种设置方式&#xff0c;在另一边博客上写得有喔。


推荐阅读
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • 原文网址:https:www.cnblogs.comysoceanp7476379.html目录1、AOP什么?2、需求3、解决办法1:使用静态代理4 ... [详细]
  • 本文详细介绍了如何使用Python中的smtplib库来发送带有附件的邮件,并提供了完整的代码示例。作者:多测师_王sir,时间:2020年5月20日 17:24,微信:15367499889,公司:上海多测师信息有限公司。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • Python 序列图分割与可视化编程入门教程
    本文介绍了如何使用 Python 进行序列图的快速分割与可视化。通过一个实际案例,详细展示了从需求分析到代码实现的全过程。具体包括如何读取序列图数据、应用分割算法以及利用可视化库生成直观的图表,帮助非编程背景的用户也能轻松上手。 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • 本指南介绍了 `requests` 库的基本使用方法,详细解释了其七个主要函数。其中,`requests.request()` 是构建请求的基础方法,支持其他高级功能的实现。此外,我们还重点介绍了如何使用 `requests.get()` 方法来获取 HTML 网页内容,这是进行网页数据抓取和解析的重要步骤。通过这些基础方法,读者可以轻松上手并掌握网页数据抓取的核心技巧。 ... [详细]
author-avatar
黄姐佛光普照_516
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有