实验_Struts2实现登陆功能(验证码校验)

来源:互联网 发布:淘宝彩票恢复 编辑:程序博客网 时间:2024/05/18 02:58

Struts2实现登陆功能(验证码校验)

1.实验名称
熟悉Struts2核心文件

2.实验目的
(1)熟悉Struts2的配置文件web.xml和struts.xml。
(2)熟悉如何书写用户定义的控制器。

3.实验内容
实现如下页面中登陆的功能。
图片一

要求:
管理员登录后跳到管理员登陆成功的页面
普通用户登录后跳到普通用户登陆成功的页面
登录时用户名密码输入错跳到出错页
注册和登录时用户名,密码没有输入时跳到登陆页,并在登陆页上显示校验失败的相关提示

4.文件描述:
ChrUser.java:类中封装username,password,type,check等属性及其getter(),setter()方法
CreateImageAction.java:随机生成验证码的Action,其中包含图片生成过程以及设置浏览器缓存的方法。将生成的随机数放到session中,然后页面提交验证随机数。
LoginAction.java:接收登陆表单页提交的数据,以及将各类错误信息放入session
struts.xml:struts配置文件
login.jsp:登录页,包括用户名,密码,用户类型以及验证码的显示与刷新
welcome.jsp:登录用户欢迎页,可显示用户类型与用户名

5.实验源代码

  • ChrUser.java
public class ChrUser {    private String username;    private String password;    private String type;    private String checkCode;    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;    }    public String getType() {        return type;    }    public void setType(String type) {        this.type = type;    }    public String getCheckCode() {        return checkCode;    }    public void setCheckCode(String check) {        this.checkCode = checkCode;    }}
  • CreateImageAction.java
import java.awt.Color;  import java.awt.Font;  import java.awt.Graphics;  import java.awt.image.BufferedImage;  import java.io.ByteArrayInputStream;  import java.io.ByteArrayOutputStream;  import java.util.Random;  import javax.imageio.ImageIO;  import javax.servlet.http.HttpServletResponse;  import javax.servlet.http.HttpSession;  import org.apache.struts2.ServletActionContext;  import com.opensymphony.xwork2.ActionSupport;  public class CreateImageAction extends ActionSupport{        private ByteArrayInputStream inputStream;        private static int WIDTH = 60;        private static int HEIGHT = 20;        public ByteArrayInputStream getInputStream()        {          return inputStream;        }        public void setInputStream(ByteArrayInputStream inputStream)        {          this.inputStream = inputStream;        }        private static String createRandom()        {           String str = "0123456789qwertyuiopasdfghjklzxcvbnm";           char[] rands = new char[4];           Random random = new Random();           for (int i = 0; i < 4; i++)          {            rands[i] = str.charAt(random.nextInt(36));           }            return new String(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);              }           }          private void drawRands(Graphics g, String rands)          {  g.setColor(Color.BLACK);             g.setFont(new Font(null, Font.ITALIC | Font.BOLD, 18));             // 在不同的高度上输出验证码的每个字符             g.drawString("" + rands.charAt(0), 1, 17);             g.drawString("" + rands.charAt(1), 16, 15);             g.drawString("" + rands.charAt(2), 31, 18);             g.drawString("" + rands.charAt(3), 46, 16);             System.out.println(rands);          }          public String execute() throws Exception          {  HttpServletResponse response = ServletActionContext.getResponse();             // 设置浏览器不要缓存此图片             response.setHeader("Pragma", "no-cache");             response.setHeader("Cache-Control", "no-cache");             response.setDateHeader("Expires", 0);             String rands = createRandom();             BufferedImage image = new BufferedImage(WIDTH, HEIGHT,                      BufferedImage.TYPE_INT_RGB);             Graphics g = image.getGraphics();             // 产生图像             drawBackground(g);             drawRands(g, rands);             // 结束图像 的绘制 过程, 完成图像             g.dispose();             ByteArrayOutputStream outputStream = new ByteArrayOutputStream();             ImageIO.write(image, "jpeg", outputStream);             ByteArrayInputStream input = new ByteArrayInputStream(outputStream                      .toByteArray());             this.setInputStream(input);             HttpSession session =ServletActionContext.getRequest().getSession();             session.setAttribute("checkCode", rands);                input.close();               outputStream.close();             return SUCCESS;          }      }  
  • LoginAction.java
import javax.servlet.http.HttpSession;  import org.apache.struts2.ServletActionContext;  import com.opensymphony.xwork2.ActionSupport;  import nuc.sw.User.chrUser;  public class LoginAction extends ActionSupport{      private chrUser user;      public User getUser() {          return user;      }      public void setUser(User user) {          this.user = user;      }      public String execute() throws Exception      {          return SUCCESS;  }   @Override    public String execute() throws Exception {      // TODO Auto-generated method stub      //接收登陆表单页提交的数据    if(username.equals("程浩然")&&password.equals("123")) {      ActionContext.getContext().getSession().put("user",username);      ActionContext.getContext().getSession().put("type",type);      return SUCCESS;     }    else {      ActionContext.getContext().getSession().put("error","用户名或密码错误");      return ERROR;     }   }       @Override      public void validate()     {        HttpSession session = ServletActionContext.getRequest().getSession();            String checkCode2 = (String)session.getAttribute("checkCode");                 if(!checkCode.equals(checkCode2)){        addFieldError(checkCode, "输入的验证码不正确,请重新输入");       }    if(user.getUsername()==null||user.getUsername().trim().equals("")){      this.addFieldError("usererror", "用户名不能为空");     }    if(user.getPassword()==null||user.getPassword().trim().equals("")){      this.addFieldError("passerror", "密码不能为空");     }      }  }  
  • struts.xml
<struts>    <package name="user" namespace="/" extends="struts-default">      <action name="LoginAction" class="nuc.sw.action.LoginAction">       <result name="success">        /welcome.jsp       </result>       <result name="error">        /login.jsp       </result>       <result name="input">        /login.jsp       </result>      </action>      <action name="createImageAction" class="nuc.sw.action.CreateImageAction">         <result name="success" type="stream">           <param name="contentType">image/jpeg</param>           <param name="inputName">inputStream</param>         </result>        </action>     </package></struts>
  • login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@ taglib prefix="s" uri="/struts-tags" %>    <!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"><script type="text/javascript">      function refresh() {      //IE存在缓存,需要new Date()实现更换路径的作用    document.getElementById("image").src="createImageAction.action?+Math.random()"+new Date();    }    </script><title>登录页</title></head><body>  <font color="red">${sessionScope.error}</font>  <font color="red"><s:fielderror></s:fielderror></font>  <form action="LoginAction" method="post">    用户名:<input type="text" name="username"><br>    密&nbsp;&nbsp;&nbsp;&nbsp;码:<input type="text" name="password"><br>    用户类型:<select name="type">              <option>普通用户</option>              <option>管理员</option>            </select><br>    验证码:<s:textfield name="checkCode"></s:textfield>          <img src="image" onclick="refresh" title="看不清?换一个"/><br>          <s:actionerror cssStyle="color:red"/>    <input type="submit" value="登陆">  </form></body></html>
  • welcome.jsp
<%@ 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> 欢迎${session.type}${session.user}登陆!</body></html>