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>");
    }
}

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

目录
相关文章
|
8月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
777 1
|
XML 安全 前端开发
一行代码搞定禁用 web 开发者工具
在如今的互联网时代,网页源码的保护显得尤为重要,特别是前端代码,几乎就是明文展示,很容易造成源码泄露,黑客和恶意用户往往会利用浏览器的开发者工具来窃取网站的敏感信息。为了有效防止用户打开浏览器的 Web 开发者工具面板,今天推荐一个不错的 npm 库,可以帮助开发者更好地保护自己的网站源码,本文将介绍该库的功能和使用方法。 功能介绍 npm 库名称:disable-devtool,github 路径:/theajack/disable-devtool。从 f12 按钮,右键单击和浏览器菜单都可以禁用 Web 开发工具。 🚀 一行代码搞定禁用 web 开发者工具 该库有以下特性: • 支持可配
1356 22
|
11月前
|
缓存 前端开发 应用服务中间件
Web端实时通信技术SSE在携程机票业务中的实践应用
本文介绍了携程机票前端基于Server-Sent Events(SSE)实现服务端推送的企业级全链路通用技术解决方案。文章深入探讨了 SSE 技术在应用过程中包括方案对比、技术选型、链路层优化以及实际效果等多维度的技术细节,为类似使用场景提供普适性参考和借鉴。该方案设计目标是实现通用性,适用于各种网络架构和业务场景。
379 1
|
12月前
|
缓存 前端开发 应用服务中间件
Web端实时通信技术SSE在携程机票业务中的实践应用
本文介绍了携程机票前端基于Server-Sent Events(SSE)实现服务端推送的企业级全链路通用技术解决方案。文章深入探讨了 SSE 技术在应用过程中包括方案对比、技术选型、链路层优化以及实际效果等多维度的技术细节,为类似使用场景提供普适性参考和借鉴。
468 7
|
前端开发 JavaScript 搜索推荐
HTML与CSS在Web组件化中的核心作用及前端技术趋势
本文探讨了HTML与CSS在Web组件化中的核心作用及前端技术趋势。从结构定义、语义化到样式封装与布局控制,两者不仅提升了代码复用率和可维护性,还通过响应式设计、动态样式等技术增强了用户体验。面对兼容性、代码复杂度等挑战,文章提出了相应的解决策略,强调了持续创新的重要性,旨在构建高效、灵活的Web应用。
430 6
|
开发框架 .NET PHP
ASP.NET Web Pages - 添加 Razor 代码
ASP.NET Web Pages 使用 Razor 标记添加服务器端代码,支持 C# 和 Visual Basic。Razor 语法简洁易学,类似于 ASP 和 PHP。例如,在网页中加入 `@DateTime.Now` 可以实时显示当前时间。
|
缓存 安全 前端开发
构建高效Web应用的五大关键技术
【10月更文挑战第42天】在数字化浪潮中,Web应用已成为企业与用户互动的重要桥梁。本文将深入探讨提升Web应用性能和用户体验的五项核心技术,包括前端优化、后端架构设计、数据库管理、安全性增强以及API开发的最佳实践。通过这些技术的应用,开发者可以构建出更快、更稳定且更安全的Web应用,满足现代网络环境的需求。
|
7月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
602 4
|
11月前
|
缓存 JavaScript 前端开发
鸿蒙5开发宝藏案例分享---Web开发优化案例分享
本文深入解读鸿蒙官方文档中的 `ArkWeb` 性能优化技巧,从预启动进程到预渲染,涵盖预下载、预连接、预取POST等八大优化策略。通过代码示例详解如何提升Web页面加载速度,助你打造流畅的HarmonyOS应用体验。内容实用,按需选用,让H5页面快到飞起!
|
11月前
|
JavaScript 前端开发 API
鸿蒙5开发宝藏案例分享---Web加载时延优化解析
本文深入解析了鸿蒙开发中Web加载完成时延的优化技巧,结合官方案例与实际代码,助你提升性能。核心内容包括:使用DevEco Profiler和DevTools定位瓶颈、四大优化方向(资源合并、接口预取、图片懒加载、任务拆解)及高频手段总结。同时提供性能优化黄金准则,如首屏资源控制在300KB内、关键接口响应≤200ms等,帮助开发者实现丝般流畅体验。

热门文章

最新文章