danzi638 2016-09-11 09:42 采纳率: 0%
浏览 1545
已结题

用Struts2生成验证码,验证码图片显示不出来。

最近在学Struts2,有一个题目是使用Struts2写一个有验证码的登陆界面。但是怎么试验证码都出不来,麻烦各位大神帮我解决下。谢谢。

界面

图片说明

LoginValidateAction.java

package cn.edu.xmut.action;

import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class LoginValidateAction extends ActionSupport
{
/**
*
*/
private static final long serialVersionUID = 1L;
private String checkCode;
public String getCheckCode()
{
return checkCode;
}
public void setCheckCode(String checkCode)
{
this.checkCode = checkCode;
}
@Override
public String execute() throws Exception
{
return SUCCESS;
}
@Override
public void validate()
{
HttpSession session = ServletActionContext.getRequest().getSession();

    String checkCode2 = (String)session.getAttribute("checkCode");

    if(!checkCode.equals(checkCode2))
    {
        this.addActionError("输入的验证码不正确,请重新输入!");
    }
}

}

CreateImageAction.java

package cn.edu.xmut.action;

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 static final long serialVersionUID = 1L;
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);

}

@Override
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;
}

}

struts.xml配置



image/jpeg
inputStream



/success.jsp
/login.jsp

login.jsp



image/jpeg
inputStream



/success.jsp
/login.jsp

  • 写回答

1条回答

  • danzi638 2016-09-11 09:46
    关注

    Struts2.jsp

        <action name="cteateImageAction" class="cn.edu.xmut.action.CreateImageAction">
             <result name = "success" type="stream">
                <param name = "contentType">image/jpeg</param>
                <param name = "inputName">inputStream</param>
             </result>
             </action>
              <action name="loginValidateAction" class="cn.edu.xmut.action.LoginValidateAction">
                    <result name="success">/success.jsp</result>
                    <result name="input">/login.jsp</result>
                </action>
    

    login.jsp

     <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <html>
      <head>
        <base href="<%=basePath%>">
    
        <title>My JSP 'login.jsp' starting page</title>
    
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
        <!--
        <link rel="stylesheet" type="text/css" href="styles.css">
        -->
    
      </head>
    
      <body>
    
        <h3><font color="blue">带有验证码的登陆界面</font></h3>
    
        <s:form action="loginValidateAction.action" theme="simple">
    
            用户名:<s:textfield name="username"></s:textfield><br>
            密码    :<s:password name="password"></s:password><br>
            验证码:<s:textfield name="checkCode"></s:textfield>
         
         <!--若要点击图片刷新,重新得到一个验证码,要在后面加上个随机数,这样保证每次提交过去的都是不一样的path,防止因为缓存而使图片不刷新-->
            <img src="createImageAction.action" onclick="this.src='createImageAction.action?'+ Math.random()" title="点击图片刷新验证码"/><br>
            <s:actionerror cssStyle="color:red"/>
    
            <s:submit value="提交"></s:submit>
    
        </s:form>
    
      </body>
    </html>
    
    评论

报告相同问题?

悬赏问题

  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 ubuntu系统下挂载磁盘上执行./提示权限不够
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误