首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JSP与Servlet组合实现登录功能(附加验证码)

JSP与Servlet组合实现登录功能(附加验证码)

作者头像
天道Vax的时间宝藏
发布于 2021-08-11 02:47:05
发布于 2021-08-11 02:47:05
1.3K00
代码可运行
举报
运行总次数:0
代码可运行

User.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.bean;

public class xzk_User {
	String userid;
	String password;
	public String getUserid() {
		return userid;
	}
	public String getPassword() {
		return password;
	}
	public void setUseid(String id) {
		userid=id;
	}
	public void setPassword(String pw) {
		password=pw;
	}
}

index.jsp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>首页</title>
</head>
<body>
	<jsp:forward page="login.jsp"></jsp:forward>
</body>
</html>

login.jsp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>登录</title>
<style type="text/css"> div{text-align:center}</style>
</head>
<body>
<div>
	<form name="reg" action="/2019_11_14_xzk.test/XZK_LoginServlet" method="post">
		用户名:<input name="userid" type="text" size="30"/><br />
		密   码 :<input name="password" type="password" size="30"/><br />
		验证码:<input type="text" name="check_code" size="20">
			  <img src="XZK_CheckServlet"><br />
		<input type="submit" value="提交" id="bt" />
	</form>
</div>
<!-- JSP页面的普通注释:注释的内容是可见的,将出现在生成的HTML代码中,此代码将发送给
浏览器,然后由浏览器负责忽略此注释。 -->
<%-- JSP页面中的隐藏注释:标记的内容客户端查看源码时是完全看不到的。 --%>
<% // JSP中java代码块单行注释:客户端不可见 %> 
<% /* JSP中java代码块多行注释:客户端不可见 */ %>
</body>
</html>

LoginServlet.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.loginPage;

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 com.bean.xzk_User;

public class XZK_LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html;charset=utf-8");
		String userid=req.getParameter("userid");
		String password=req.getParameter("password");
		String checkCode=req.getParameter("check_code");
		String savedCode=(String )req.getSession().getAttribute("check_code");
		PrintWriter pw=resp.getWriter();
		if(("xzk").equals(userid)&&("521").equals(password)&&checkCode.equals(savedCode)) {//少验证码验证部分
			xzk_User user=new xzk_User();
			user.setUseid(userid);
			user.setPassword(password);
			req.getSession().setAttribute("user", user);
			resp.sendRedirect("/2019_11_14_xzk.test/main.jsp");
		}else if(checkCode.equals(savedCode)){
			pw.write("用户名或密码错误,登陆失败,请您重新输入");
		}else {
			pw.write("验证码错误");
		}
		
		//response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(req, resp);
	}

}

main.jsp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8" import="com.bean.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>首页</title>
<style>
    *{
    padding:0;
    margin:0;
    font-family:"微软雅黑";
}
.header{
    height:72px;
    background:#458fce ;
}
.header .logo{
    color:#fff ;
    line-height:70px;
    font-size:30px;
    margin-left:20px;
    display:inline-block;
    text-align:center;

}
a {
    color: #fff ;
    text-decoration: none ;
}
.header .login{
    float:right;
    color:#fff ;
    line-height:72px;
    margin-right:2px;
    display:inline-block;
}
.banner{
    height:380px;
    overflow:hidden;
    background: #ddd;
}
</style>
</head>
<body>
    <div class="header">
        <div class="logo">JavaWeb实验一</div>
        <div class ="login">
            <a href ="/2019_11_14_xzk.test/XZK_IndexServlet">个人中心</a>
            <span>|</span> 
            <a href ="/2019_11_14_xzk.test/XZK_LoginOutServlet">退出</a>
        </div>
    </div>
    <br />
    	用户名:xzk
    <% 
    	xzk_User u=(xzk_User)new xzk_User();
    %>
    <!-- JSP页面的普通注释:注释的内容是可见的,将出现在生成的HTML代码中,此代码将发送给浏览器,然后由浏览器负责忽略此注释。 -->
	<%-- JSP页面中的隐藏注释:标记的内容客户端查看源码时是完全看不到的。 --%>

	<% // JSP中java代码块单行注释:客户端不可见 %> 
	<% /* JSP中java代码块多行注释:客户端不可见 */ %>
</body>
</html>

IndexServlet.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.loginPage;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.bean.xzk_User;

public class XZK_IndexServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
		HttpSession session = request.getSession();
		xzk_User user = (xzk_User) session.getAttribute("user");
		if(user == null){
			response.getWriter().print("你还没有登陆或输入用户名,请重新登录<a href='/2019_11_14_xzk.test/main.jsp'>进入首页</a>");
		} else {
			response.getWriter().print("你已经登陆成功欢迎你" + user.getUserid() + "!");
			response.getWriter().print("<a href='/2019_11_14_xzk.test/XZK_LoginOutServlet'>退出</a>");
			}
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}
}

LoginoutServlet.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.loginPage;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class XZK_LoginOutServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.getSession().removeAttribute("userid");
		resp.sendRedirect("/2019_11_14_xzk.test/index.jsp");
		//response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {	
		doGet(req, resp);
	}
}

CheckServlet.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.loginPage;
 import java.io.*;
 import javax.servlet.*;
 import javax.servlet.http.*;
 import java.awt.*;
 import java.awt.image.*;
 import javax.imageio.ImageIO;
 public class XZK_CheckServlet extends HttpServlet
 {
	private static final long serialVersionUID = 1L;
	private static int WIDTH = 60; //验证码图片宽度
 	private static int HEIGHT = 20; //验证码图片高度
 public void doGet(HttpServletRequest request,HttpServletResponse response) 
 			throws ServletException,IOException{		
 		HttpSession session = request.getSession();
 		response.setContentType("image/jpeg");
 		ServletOutputStream sos = response.getOutputStream();		    response.setHeader("Pragma","No-cache");
 		response.setHeader("Cache-Control","no-cache");
 		response.setDateHeader("Expires", 0);
		BufferedImage image = 
 			new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); 
 		Graphics g = image.getGraphics();
 		char [] rands = generateCheckCode();
 		drawBackground(g);
 		drawRands(g,rands);
		g.dispose();
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
 		ImageIO.write(image, "JPEG", bos);
 		byte [] buf = bos.toByteArray();
 		response.setContentLength(buf.length);
		sos.write(buf);
 		bos.close();
 		sos.close();
 		session.setAttribute("check_code",new String(rands));
	}
	private char [] generateCheckCode()
 	{
 		String chars = "0123456789abcdefghijklmnopqrstuvwxyz";
 		char [] rands = new char[4];
 		for(int i=0; i<4; i++)
 		{
 			int rand = (int)(Math.random() * 36);
 			rands[i] = chars.charAt(rand);
 		}
 		return rands;
 	}
 	private void drawRands(Graphics g , char [] rands)
 	{
 		g.setColor(Color.BLACK);
 		g.setFont(new Font(null,Font.ITALIC|Font.BOLD,18));
 		g.drawString("" + rands[0],1,17);
 		g.drawString("" + rands[1],16,15);
 		g.drawString("" + rands[2],31,18);
 		g.drawString("" + rands[3],46,16);
 		System.out.println(rands);
 	}
 	private void drawBackground(Graphics g)
 	{
 		g.setColor(new Color(0xDCDCDC));
 		g.fillRect(0, 0, WIDTH, HEIGHT);
		for(int i=0; i<120; i++)
 		{
 			int x = (int)(Math.random() * WIDTH);
 			int y = (int)(Math.random() * HEIGHT);
 			int red = (int)(Math.random() * 255);
 			int green = (int)(Math.random() * 255);
 			int blue = (int)(Math.random() * 255);
 			g.setColor(new Color(red,green,blue));		
 			g.drawOval(x,y,1,0);
 		}
 	}
 }

总结:刚一开始不明白JSP与html文件的具体区别,在理解上出了问题,后来通过查阅,明白JSP相对于html是会产生动态页面,且JSP只有发布到Tomcat服务器上才能打开,而html是直接可以打开的。另外能熟练掌握区分JSP中三种注释:JSP普通注释,JSP隐藏注释还有java代码注释。熟练掌握JSP语言的page属性值以及标识性动作forward的用法。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/11/17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
致远OA文件上传漏洞(含批量检测POC)
致远OA A6、A8、A8N (V8.0SP2,V8.1,V8.1SP1) 致远OA G6、G6N (V8.1、V8.1SP1)
没事就要多学习
2024/07/18
1.1K0
致远OA文件上传漏洞(含批量检测POC)
红队内网渗透工具(-甲方自查工具)
RequestTemplate是一款两端并用的红队渗透工具以及甲方自查工具,其在内网渗透过程中有着不可替代的作用。
释然IT杂谈
2023/08/18
4700
红队内网渗透工具(-甲方自查工具)
内网渗透-春秋云镜篇(Privilege)
根据题目描述我们获取到了Jekins根目录为C:\ProgramData\Jenkins\.jenkins,然后我们这里搜索过后可以发现初始密码路径
亿人安全
2024/04/12
6360
内网渗透-春秋云镜篇(Privilege)
由外网打点到内网横向
2023年新年的一个渗透测试新年小比赛,来打着练练手,最终只完成了这些,想看官方讲解学习一下来着,结果官方是个买课呢,清高不理人[ps:你清高,你了不起],放博客里面记录一下吧
故里[TRUE]
2023/04/21
1.4K0
由外网打点到内网横向
【攻防演练】从钓鱼上线到内网漫游
一般钓鱼对象选取安全意识比较薄弱的岗位,如客服、招聘HR,在互联网或招聘app上可以搜集到
hyyrent
2022/12/26
9190
【攻防演练】从钓鱼上线到内网漫游
2022年江苏工控选拔赛WP-Web
比赛分两场, 上半场是早上的上午9点开始12点结束(CTF), 下半场是下午2点开始4点结束(场景题 渗透测试)
h0cksr
2023/05/18
5240
fscan:一键自动化、全方位漏洞扫描的开源工具
它支持主机存活探测、端口扫描、常见服务的爆破、ms17010、redis批量写公钥、计划任务反弹shell、读取win网卡信息、web指纹识别、web漏洞扫描、netbios探测、域控识别等功能。
杰哥的IT之旅
2021/05/07
4.9K0
fscan:一键自动化、全方位漏洞扫描的开源工具
【打靶练习】Delegation
Delegation是一套难度为中等的靶场环境,完成该挑战可以帮助玩家了解内网渗透中的代理转发、内网扫描、信息收集、特权提升以及横向移动技术方法,加强对域环境核心认证机制的理解,以及掌握域环境渗透中一些有趣的技术要点。该靶场共有4个flag,分布于不同的靶机。
YanXia
2025/07/13
590
bugku渗透(一)
bugku出了新的模式,渗透测试,来水水文章,一共有十一个场景,也就是相当于十一个题目吧
故里[TRUE]
2023/04/20
1.1K0
bugku渗透(一)
【攻防演练】从钓鱼上线到内网漫游
声明:请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。
亿人安全
2022/12/23
6970
【攻防演练】从钓鱼上线到内网漫游
致远OA SQL&任意文件下载漏洞(含批量检测POC)
致远OA A6 test.jsp 存在sql注入漏洞,并可以通过注入写入webshell文件控制服务器
没事就要多学习
2024/07/18
5600
致远OA SQL&任意文件下载漏洞(含批量检测POC)
【永久开源】vulntarget-a 打靶记录
乌鸦安全的技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。
乌鸦安全
2022/03/11
4.1K0
【永久开源】vulntarget-a 打靶记录
攻防|记一次VMware vCenter后渗透过程
针对VMware vCenter的介绍就不多说了,大佬们可以自己搜搜。这里只分享过程和踩到的坑点&技巧。
亿人安全
2024/07/12
8280
攻防|记一次VMware vCenter后渗透过程
Fastjson姿势技巧集合
https://github.com/safe6Sec/ShiroAndFastJson
阿超
2022/11/10
3.2K0
b站1024安全攻防挑战赛
getFormatter 这里就要返回 array(new Action(), 'run') 来让 call_user_fun_array 触发 run 函数,即 Content 里有 $this->formatters = array('close'=>array(new Action(), 'run'))
pankas
2022/11/11
9970
b站1024安全攻防挑战赛
内网渗透—春秋云镜篇之2022网鼎杯
朋友们现在只对常读和星标的公众号才展示大图推送,建议大家把“亿人安全“设为星标”,否则可能就看不到了啦
亿人安全
2024/02/27
6000
【实战】记一次攻防演练之vcenter后渗透利用
乌鸦安全的技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。
乌鸦安全
2022/12/19
2.1K0
【实战】记一次攻防演练之vcenter后渗透利用
Bazel remote cache
本篇的源码放在: https://github.com/backendcloud/example/tree/master/bazel-remote
后端云
2022/11/25
1.5K0
实战 | fastjson 漏洞的发现与测试
Fastjson 是阿里巴巴公司开源的一款 json 解析器,其性能优越,被广泛应用于各大厂商的 Java 项目中。fastjson 于 1.2.24 版本后增加了反序列化白名单,而在 1.2.48 以前的版本中,攻击者可以利用特殊构造的 json 字符串绕过白名单检测,成功执行任意命令。
信安之路
2021/12/09
9K0
实战 | fastjson 漏洞的发现与测试
内网 HTTPS 可信证书
  开发团队或者公司内部一般会采用内外网隔离、上网行为过滤等措施,比较可靠地保证了内部设备无法被外部网络所侦测,从而可能认为 HTTP 内网站点是一个相对安全的存在。即使在 HTTPS 证书如此盛行的今天,也还暂时不考虑内部站点的 HTTPS 化。IP + Port 或者 http://本地域名 的访问方式依旧是座上宾。当然,如果考虑到购买 HTTPS 证书的成本或者团队内网站点采用 Letsencrypt 等免费证书过于麻烦(只能采用 DNS 验证的方式每三个月申请一次新证书),那么自签名 SSL 证书则成为首选了。不过,如果为每一个内网站点都生成一个 SSL 证书,然后让大家都手动把 HTTPS 标为可信,那么当面临大量内网站点时,大家可能要被搞崩溃。更为可行的办法是,生成一个内网用的根证书,只标记该根证书可信。
zhonger
2022/10/28
7K0
内网 HTTPS 可信证书
相关推荐
致远OA文件上传漏洞(含批量检测POC)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档