任务要求:
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() {
}
}
功能还没有完全实现,先记录下来当前进度,等改好了再更新。