2 danzi638 danzi638 于 2016.09.11 17:50 提问

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

最近在学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;
    }
}

Struts2配置

```

image/jpeg
inputStream



/success.jsp
/login.jsp


# 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+"/";
%>





    <s:submit value="提交"></s:submit>

</s:form>






2个回答

danzi638
danzi638   2016.09.11 17:52

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>

Marksinoberg
Marksinoberg   Ds   Rxr 2016.09.11 18:37

查看一下网页的源代码,看看是不是图片的路径没有写正确?

或者debug一下生成验证码的那个类,看看是否真正可以生成一张图片。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
图片验证码显示不出来的问题
     昨天做一个后台登录,需要一个做一个图片验证码。遇到了这个问题,我是首先检查代码,发现代码没有任何问题。又做了个测试页面,在我机器本地仍然不能运行,我就把测试页面传到服务器上,结果还是显示不出来验证图片,我索性把地址传给同事,结果在他的机器上可以运行了!当时第一个念头就是cookies没有清空?或者Temp里有残留的脱机信息,我把我怀疑的地方都检查并且处理了以后,结果还是显示不出来!最后一
登录验证码(验证码图片用jsp显示出来的)
login.jsp<span> <label for="code" style="width:64px;height:32px;display:inline-block;line-height:32px;">验证码:</label> <input type="text" id="checkcode" name="checkcode" style="width:130px
struts2中验证码的生成和使用
struts2,验证码,验证码的生成
php生成的验证码图片不显示问题
1.先屏蔽掉输出图片的代码:header("Content-Type:image/png"); 2.访问图片,检查代码错误 3.然后检查验证码之前是否有输出,如果有输出内容,验证码是不会显示的 4.检查gd库是否开启 5.如果都没有问题,在header("Content-Type:image/png")之前加上ob_clean()代码即可完美解决(注:ob_clean()的作用是清除ob缓
javaweb项目,java代码生成的验证码,到服务器上显示不出来的问题!
本地项目上传到服务器上,验证码显示不出来。
Php图片验证码显示不出来的解决过程
问题 今天在在本地新建了一个虚拟主机,把以前写好的一个php小网站部署上去,因为以前用的wamp集成环境,所以没有出现这种情况。现在突然发现验证码竟然刷不出来了。 于是便开启了找bug之旅,在网上找了许多办法,最后终于解决了,现在分享如下: bug1 出现上面的情况,最基本的一个错误就是你很可能在php里面忘记安装gd模块了。 window环境下面只需要在php.ini文件里面找
Struts2验证框架 图片验证码 自定义验证器
首先我们需要一个生成图片验证码的类 http://blog.csdn.net/ruixue0117/article/details/22829557 但是要做一点小修改: 把上述网页中的类VerifyCodeUtils改为struts2 的action,即 public class ValidationCodeAction extends ActionSupport implements Ses
jsp 不显示验证码图片问题的解决办法之一
在显示图片的页面中加上
解决thinkPHP图片验证码不显示的问题
thinkPHP 验证码 因其本身有错无法显示
验证码图片显示不了,并且抛出bufferedimage之类的exception
验证码图片显示不了,并且抛出bufferedimage之类的exception,很有可能是