Web---session技术代码演示(request,session,servletContext)(2)

简介: Web---session技术代码演示(request,session,servletContext)

为了防止误关浏览器导致session访问不到的解决办法:


或者你把浏览器关了再打开,session的值也没有了!

这个时候,有的时候就会出现手误的情况,不小心把浏览器关了,着就很尴尬了,所以呢,有的网站为例预防这种情况,就可以这样来做!!!


在SaveServlet类中加上这样的代码就可以了!!

    //把cookie技术和session技术联合起来做应用的一个例子---
        //功能:让用户在关闭浏览器之后,如果5分钟之内再登陆本网站,还能访问到session
        //其实原理很简单,就是向客户端写一个key为"JSESSIONID",value用sessionid的cookie
        System.out.println(request.getSession().getId());
        System.out.println(request.getSession().getAttribute("JSESSIONID"));
        Cookie c = new Cookie("JSESSIONID", request.getSession().getId());
        c.setMaxAge(60*5);//5分钟后过期
        c.setPath(request.getContextPath());//权限给本站的所有网页/servlet
        //---根据客户端无论访问那个网站的哪个网页都会有JSESSIONID可以知道,这个的权限路径肯定是项目根目录下面
        response.addCookie(c);


演示验证码-利用session传递值:

index.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <script type="text/javascript">
        function get(){
            var nameElement = document.getElementById("inputName");
            var pwdElement = document.getElementById("inputPwd");
            var cs = document.cookie.split("; ");//按分号+空格拆分
            //alert(document.cookie);
            var name="";
            var pwd="";
            for(var x=0;x<cs.length;x++){
                cs[x] = decodeURI(cs[x]);
                //alert(cs[x]);
                var strs = cs[x].split("=");
                //alert(strs);
                //alert("strs[0]="+strs[0]);
                //alert("strs[1]="+strs[1]);
                strName=strs[0];
                if(strs[0]=="name1"){
                    name=strs[1];
                }else if(strs[0]=="pwd1"){
                    pwd=strs[1];
                }
            }
            nameElement.value =name;
            pwdElement.value = pwd;
            //alert(name);
            //alert(pwd);
        }
        function leave(element,name){
            var date = new Date();
            date.setTime( date.getTime()+ 1000*60*60 );
            var key = name;
            var value = element.value;
            value = encodeURI(value);//中文编码X
            document.cookie=key+"="+value+";expires="+date.toGMTString()+";path=/";
        }
    </script>
  </head>
  <body onload="get()">
    <h2>演示验证码</h2>
    <form action="session/LoginServlet" method="post">
        Name:<input id="inputName" type="text" name="name" value="" onblur="leave(this,'name1');"/><br/>
        Pwd:<input id="inputPwd" type="password" name="pwd" value="" onblur="leave(this,'pwd1');"/><br/>
        <%  Date d = new Date();
            long str = d.getTime();
        %>
        <a href="index.jsp?time=<%=str %>"><img src="servlet/ImgServlet"/></a><input type="text" name="code"/>
        <input type="submit" value="登录" />
    </form>
    <br/><br/><br/><br/>
  </body>
</html>


ImgServlet.java:

package cn.hncu.servlets.session;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
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 ImgServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("image/jpg");//告诉浏览器,你发过去的数据是什么类型
        int width = 60;
        int height = 30;
        BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics g = img.getGraphics();
        g.setFont(new Font("宋体", Font.BOLD, 18));
        Random r = new Random(new Date().getTime());
        String str="";
        for(int i=0;i<4;i++){
            int a = r.nextInt(10);
            str+=a;
            int x1=r.nextInt(width);
            int x2=r.nextInt(width);
            int y1=r.nextInt(height);
            int y2=r.nextInt(height);
            g.drawLine(x1, y1, x2, y2);
        }
        //将生成的验证码放入session---真值
        request.getSession().setAttribute("realCode", str);
        g.drawString(str, 0, height);
        g.dispose();//把图刷到img当中去
        ImageIO.write(img, "jpg", response.getOutputStream());
    }
}


LoginServlet.java:

package cn.hncu.servlets.session;
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 LoginServlet extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        request.setCharacterEncoding("utf-8");
        //从客户端获取输入的name,pwd,code
        String name = request.getParameter("name");
        String pwd = request.getParameter("pwd");
        String code = request.getParameter("code");//这是用户输入的验证码
        String realCode = (String) request.getSession().getAttribute("realCode");//后台保存的真实验证码
        if(code==null || !code.equals(realCode)){
            out.print("<h1>验证码错误!!!</h1>");
        }else{
            //这里我们因为没做数据库,假定我们只判断name和pwd,如果name和pwd相同,我们就认为他登录成功
            if(name!=null&&name.trim().length()>0&&name.equals(pwd)){
                out.print("<h1>欢迎回来!"+name+".</h1>");
            }else{
                out.print("<h1>用户名或者密码不正确!</h1>");
            }
        }
        //这个必须要清!验证完之后清除原来旧的验证码
        request.getSession().removeAttribute("realCode");
    }
}

演示结果:


嘿嘿,就不演示啦,就是一个简单session传递验证~

添加了验证码和保存上一个name和密码的功能。


重写URL,安全退出:


如果浏览器不支持Cookie或用户阻止了所有Cookie,可以把会话ID附加在HTML页面中所有的URL上,这些页面作为响应发送给客户。这样,当用户单击URL时,会话ID被自动作为请求行的一部分而不是作为头行发送回服务器。这种方法称为URL重写(URL rewriting)。


何为安全登录和安全退出:

当用户登录后,一般在Session中保存有用户的信息。

Session.setAttirubte(…)

用户退出时,应该当将自己的信息从Session中清除-即安全退出。

Session.invalidate();

Session.removeAttribute(…)


index.jsp:


<h2>演示重写url技术---破解用户禁用cookie之后,我们session无效的问题</h2>
    <form action="<%= response.encodeURL("SaveServlet") %>" method="post">
        Name:<input type="text" name="name"/><br/>
        <input type="submit"/>
    </form>
    <a href="<%=response.encodeURL("GetServlet") %>">重写url-读取几个容器中的数据</a></br>
    <a href="<%=response.encodeURL("LogoutServlet")%>"> 重写url-安全退出 </a>
    <!-- 点击上面的安全退出后,这个浏览器原来的session就会失效! -->

web.xml:

<servlet>
    <servlet-name>LogoutServlet</servlet-name>
    <servlet-class>cn.hncu.servlets.session.LogoutServlet</servlet-class>
  </servlet>
<servlet-mapping>
    <servlet-name>LogoutServlet</servlet-name>
    <url-pattern>/LogoutServlet</url-pattern>
  </servlet-mapping>

LogoutServlet.java:

package cn.hncu.servlets.session;
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 LogoutServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        //安全退出,其实很简单的,只要让session对象无效就行了!-我们可以销毁服务器中的那个session对象
        request.getSession().invalidate();
        out.print("<h1>已经安全退出了!!!</h1>");
    }
}

安全退出,一般购物网站之类隐私较多的网站用的多!

目录
相关文章
|
2月前
|
前端开发 JavaScript 搜索推荐
HTML与CSS在Web组件化中的核心作用及前端技术趋势
本文探讨了HTML与CSS在Web组件化中的核心作用及前端技术趋势。从结构定义、语义化到样式封装与布局控制,两者不仅提升了代码复用率和可维护性,还通过响应式设计、动态样式等技术增强了用户体验。面对兼容性、代码复杂度等挑战,文章提出了相应的解决策略,强调了持续创新的重要性,旨在构建高效、灵活的Web应用。
48 6
|
1月前
|
开发框架 .NET PHP
ASP.NET Web Pages - 添加 Razor 代码
ASP.NET Web Pages 使用 Razor 标记添加服务器端代码,支持 C# 和 Visual Basic。Razor 语法简洁易学,类似于 ASP 和 PHP。例如,在网页中加入 `@DateTime.Now` 可以实时显示当前时间。
|
2月前
|
XML 前端开发 JavaScript
PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑
本文深入探讨了PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑;Ajax则通过异步请求实现页面无刷新更新。文中详细介绍了两者的工作原理、数据传输格式选择、具体实现方法及实际应用案例,如实时数据更新、表单验证与提交、动态加载内容等。同时,针对跨域问题、数据安全与性能优化提出了建议。总结指出,PHP与Ajax的结合能显著提升Web应用的效率和用户体验。
60 3
|
2月前
|
存储 安全 搜索推荐
理解Session和Cookie:Java Web开发中的用户状态管理
理解Session和Cookie:Java Web开发中的用户状态管理
83 4
|
2月前
|
SQL 负载均衡 安全
安全至上:Web应用防火墙技术深度剖析与实战
【10月更文挑战第29天】在数字化时代,Web应用防火墙(WAF)成为保护Web应用免受攻击的关键技术。本文深入解析WAF的工作原理和核心组件,如Envoy和Coraza,并提供实战指南,涵盖动态加载规则、集成威胁情报、高可用性配置等内容,帮助开发者和安全专家构建更安全的Web环境。
82 1
|
2月前
|
缓存 安全 前端开发
构建高效Web应用的五大关键技术
【10月更文挑战第42天】在数字化浪潮中,Web应用已成为企业与用户互动的重要桥梁。本文将深入探讨提升Web应用性能和用户体验的五项核心技术,包括前端优化、后端架构设计、数据库管理、安全性增强以及API开发的最佳实践。通过这些技术的应用,开发者可以构建出更快、更稳定且更安全的Web应用,满足现代网络环境的需求。
|
2月前
|
人工智能 安全 物联网
区块链技术的未来展望:去中心化金融(DeFi)与Web 3.0的融合
区块链技术的未来展望:去中心化金融(DeFi)与Web 3.0的融合
|
3月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
184 3
|
1月前
|
前端开发 安全 JavaScript
2025年,Web3开发学习路线全指南
本文提供了一条针对Dapp应用开发的学习路线,涵盖了Web3领域的重要技术栈,如区块链基础、以太坊技术、Solidity编程、智能合约开发及安全、web3.js和ethers.js库的使用、Truffle框架等。文章首先分析了国内区块链企业的技术需求,随后详细介绍了每个技术点的学习资源和方法,旨在帮助初学者系统地掌握Dapp开发所需的知识和技能。
2025年,Web3开发学习路线全指南
|
2月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
208 45