Javaweb——HTML语法错误判定程序+Session使用

任务要求:

1、实现HTML语法错误判断。
2、可以提交本地或手动输入html代码。
3、增加页面需要用户输入用户名和密码,系统记录用户状态,登录状态可以提交html代码进行验证,否则不允许严验证。
4、具体的html语法可以参考网络资料,也可课堂上讲的树构建和剪枝实现。

代码:

一:代码目录:
在这里插入图片描述
二:代码实现及解析:
src里的5个Servlet类:
CheckServlet.Java

package userlogin;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.ImageIO;
public class CheckServlet extends HttpServlet
{
	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);
		//下面的语句也可写成:bos.writeTo(sos);
		sos.write(buf);
		bos.close();
		sos.close();
		//将当前验证码存入到Session中
		session.setAttribute("check_code",new String(rands));
		//直接使用下面的代码将有问题,Session对象必须在提交响应前获得
		//request.getSession().setAttribute("check_code",new String(rands));
	}
       //生成一个4字符的验证码
	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);
		//随机产生120个干扰点
		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);
		}
	}
}

IndexServlet.java

package userlogin;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.*;

import org.apache.catalina.User;
public class IndexServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
          // 解决乱码问题
		response.setContentType("text/html;charset=utf-8");
         // 创建或者获取保存用户信息的Session对象
		HttpSession session = request.getSession();
		User user = (User) session.getAttribute("user");
		if (user == null) {
			response.getWriter().print(
					"您还没有登录,请<a href='/user_login/Login.html'>登录</a>");
		} else {
			response.getWriter().print("您已登录,欢迎你," + user.getUsername() + "!");
			response.getWriter().print(
					"<a href='/LogoutServlet'>退出</a>");
			// 创建Cookie存放Session的标识号
			Cookie cookie = new Cookie("JSESSIONID", session.getId());
			cookie.setMaxAge(60 * 30);
			cookie.setPath("/userlogin");
			//cookie.setPath("/user_login");
			response.addCookie(cookie);
		}
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

LoginServlet.java

package userlogin;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.*;
import javax.servlet.http.*;

public class LoginServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		String checkCode = request.getParameter("check_code");
		String savedCode = (String) request.getSession().getAttribute(
				"check_code");
		PrintWriter pw = response.getWriter();
		if (("itcast").equals(username) && ("123").equals(password)
				&& checkCode.equals(savedCode)) {
			User user = new User();
			user.setUsername(username);
			user.setPassword(password);
			request.getSession().setAttribute("user", user);
			response.sendRedirect("/user_login/IndexServlet");
			
		} else if (checkCode.equals(savedCode)) {
			pw.write("用户名或密码错误,登录失败");
		} else {
			pw.write("验证码错误");
		}
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

LogoutServlet.java

package userlogin;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.*;
public class LogoutServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
         // 将Session对象中的User对象移除
		request.getSession().removeAttribute("user");
		response.sendRedirect("/userlogin/IndexServlet");
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

User.java

package userlogin;
public class User {
	private String username;
	private String password;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}	
}

webcontent里的html网页:
在这里插入图片描述
代码如下:

<form name="reg" action="/userlogin/LoginServlet" method="post">
		用户名: <input name="username" type="text" /><br /> 
		密码: <input name="password" type="password" /><br /> 
		验证码:<input type="text" name="check_code"> 
<img src="/userlogin/CheckServlet"><br>
		<input type="submit" value="提交" id="bt" />
</form>

代码运行过程:
在这里插入图片描述
在这里插入图片描述

最后代码运行的时候出现了一个问题,还没找到异常的原因,好像要下载个什么东西,还没下好,等下好了错误解决了再来改改,还有就是没有将html判错结合起来,html判错自己不会写,下面是别人实现的java 代码,用来学习,
代码目录,两个类:

在这里插入图片描述
代码实现及注释:
Main.java

package web;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in = new Scanner(System.in);
		String input = new String();
		ElementCheck elementCheck = ElementCheck.getInstance();
		String line = "";
		do {
			input += line;
			line = in.nextLine();
		} while(!line.equals("-1"));
		elementCheck.setCode(input);
		boolean isCorrect = elementCheck.judgeInput();
		if (isCorrect) {
			System.out.println("输入合法");
		} else {
			System.out.println("输入不合法");
		}
		in.close();
	}

}

ElementCheck.java

package web;
import java.util.*;

public class ElementCheck {
	private static String code;
	private static String output;
	private static Stack<String> stack;
	private static ElementCheck instance = null;
	
	public static ElementCheck getInstance() {
		if (instance == null) {
			stack = new Stack<String>();
			code = "";
			output = "";
			instance = new ElementCheck();
		}
		return instance;
	}
	
	public void setCode(String code) {
		ElementCheck.code = code;
		output = "";
	}
	
	public boolean judgeInput() {
		if (code.equals(""))
			return false;
		int k = 0;
		int lenCode2 = code.length();
		char code2Array[] = code.toCharArray();
		while (k < lenCode2) {
			if (code2Array[k] == '<') {
				String anElement = new String();
				while (code2Array[k] != '>') {
					if (code2Array[k] == '/') {
						if (!judgeAnElement(anElement)) {
							System.out.println("输入不合法");
							return true;
						}
					}
					anElement += code2Array[k];
					k++;
				}
				stack.add(anElement);
			}
		}
		if (!stack.empty()) {
			System.out.println("输入不合法");
			return false;
		}
		return true;
	}
	private boolean judgeAnElement(String anElement) {
		if (stack.peek().equals(anElement)) {
			stack.pop();
			return true;
		} else {
			return false;
		}
		
	}
	
	private void isElementStart() {
		
	}
}

功能还没有完全实现,先记录下来当前进度,等改好了再更新。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值