在login.jsp页面里,要显示验证码: </tr>
   <tr><td>验证码:</td><td><input type="text" name="identfiy"></td><td><img src="/servlet/ImageGerator"> <%=session.getAttribute("Login_Image_Code")%></td>
   </tr>
产生验证码的servlet的代码: package com.fuyou.servlet;import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;import javax.imageio.ImageIO;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class ImageGerator extends HttpServlet { private static final long serialVersionUID = 5688443850114813473L; private static Color getRandColor(int fc, int bc) {
Random random = new Random();
if (fc > 255)
fc = 255;
if (bc > 255)
bc = 255;
int r = fc + random.nextInt(bc - fc);
int g = fc + random.nextInt(bc - fc);
int b = fc + random.nextInt(bc - fc);
return new Color(r, g, b);
} private static String charsLong = "23456789abcdefghjklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ"; private static String chars = charsLong; public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { int charsLength = chars.length(); response.setHeader("ragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0); int width = 70, height = 20;
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics(); Random random = new Random();
g.setColor(getRandColor(200, 250));//a
g.fillRect(0, 0, width, height);
g.setFont(new Font("Times New Roman", Font.ITALIC, height));
g.setColor(getRandColor(160, 200));//b for (int i = 0; i < 35; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height); 
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x, y, x + xl, y + yl);
}
StringBuilder sRand = new StringBuilder();
String[] fontNames = { "Times New Roman", "Arial", "Book antiqua", "" };
for (int i = 0; i < 4; i++) {
g.setFont(new Font(fontNames[random.nextInt(3)], Font.ITALIC,
height));  //a
char rand = chars.charAt(random.nextInt(charsLength));
sRand.append(rand);
g.setColor(new Color(20 + random.nextInt(110), 20 + random
.nextInt(110), 20 + random.nextInt(110)));  //b
g.drawString(String.valueOf(rand), 16 * i + random.nextInt(6) + 3,
height - random.nextInt(4)); }
  g.setColor(getRandColor(160, 200));
for (int i = 0; i < 30; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(width);
int yl = random.nextInt(width);
g.drawLine(x, y, x + xl, y + yl);
}
request.getSession().setAttribute("Login_Image_Code", sRand.toString()); g.dispose();
try {
Thread.sleep(100);
} catch (Exception ex) {
}
RequestDispatcher re = request.getRequestDispatcher("../login.jsp");
re.forward(request, response);
    OutputStream os = response.getOutputStream();
     ImageIO.write(image, "JPEG", os);
  
   
 
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}}我想实现 一登录login.jsp页面,验证码就显示出来?

解决方案 »

  1.   

    <tr>
        <td>验证码:</td>
        <td><input type="text" name="identfiy"></td>
        <td><img src="/servlet/ImageGerator"></td>
    </tr>修改web.xml增加ImageGerator这个servlet的定义 <servlet>
    <servlet-name>ImageGerator</servlet-name>
    <display-name>ImageGerator</display-name>
    <servlet-class>
    com.fuyou.servlet.ImageGerator
    </servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>ImageGerator</servlet-name>
    <url-pattern>/servlet/ImageGerator</url-pattern>
    </servlet-mapping>
      

  2.   

    一楼的朋友,按你意思 我改了,但还没出来!
    web.xml<?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <servlet>
        <description>This is the description of my J2EE component</description>
        <display-name>This is the display name of my J2EE component</display-name>
        <servlet-name>ImageGerator</servlet-name>
        <servlet-class>com.fuyou.util.ImageGerator</servlet-class>
      </servlet>
      <servlet>
        <description>This is the description of my J2EE component</description>
        <display-name>This is the display name of my J2EE component</display-name>
        <servlet-name>loginservlet</servlet-name>
        <servlet-class>com.fuyou.servlet.loginservlet</servlet-class>
      </servlet><servlet-mapping>
        <servlet-name>ImageGerator</servlet-name>
        <url-pattern>/servlet/ImageGerator</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <servlet-name>loginservlet</servlet-name>
        <url-pattern>/servlet/loginservlet</url-pattern>
      </servlet-mapping>
    </web-app>
    </tr>
       <tr><td>验证码:</td><td><input type="text" name="identfiy"></td><td><img src="/servlet/ImageGerator"> <%=session.getAttribute("Login_Image_Code")%></td>
       </tr>
      

  3.   

    just try<tr>
     <td>验证码:</td>
     <td><input type="text" name="identfiy"></td>
     <td><img src="servlet/ImageGerator"></td>
    </tr>
      

  4.   

    有控制台下面的信息:2008-2-29 15:14:34 org.apache.catalina.core.StandardWrapperValve invoke
    信息: Servlet ImageGerator is currently unavailable
      

  5.   

    <img src="/servlet/ImageGerator" onload="getSession()" /><span id="validateNumber" ></span>
    <script language="javascript">
       var xhr;
       function getSession(){
           xhr=new ActiveXObject("microsoft.xmlhttp");
           xhr.open "get","servlet/GetSession",true
           xhr.onreadystatechange=functon(){
               if(xhr.readystate==4){
                  if(xhr.status==200){
                        document.getElementById("validateNumber").innerHTML=xhr.responseText
                  }
               }
           }
           xhr.send(null);
       }
    </script>public class GetSession extends HttpServlet{
        ....
        public void doGet(HttpServletRequest,HttpServletResponse) throws IOException,ServletException{
             HttpSession session=request.getSession();
             PrintWriter out=response.getWriter();
             out.println(session.getAttribute("Login_Image_Code").toString());
             out.flush();
             out.close();
        }
    }
      

  6.   

    或者在login.jsp中生成验证字符串,打印出来,在servlet中获取session中的验证字符串,生成图片验证码
      

  7.   


    <servlet>
        <description>This is the description of my J2EE component</description>
        <display-name>This is the display name of my J2EE component</display-name>
        <servlet-name>ImageGerator</servlet-name>
        <servlet-class>com.fuyou.util.ImageGerator</servlet-class>
      </servlet>
    你的代码写的是 package com.fuyou.servlet;
    这里写的是com.fuyou.util.ImageGerator搞毛啊你?
      

  8.   

    真是失误啊!改过来了,但还是有下面的错误:HTTP Status 500 - --------------------------------------------------------------------------------type Exception reportmessage description The server encountered an internal error () that prevented it from fulfilling this request.exception java.lang.IllegalStateException: getWriter() has already been called for this response
    org.apache.catalina.connector.Response.getOutputStream(Response.java:576)
    org.apache.catalina.connector.ResponseFacade.getOutputStream(ResponseFacade.java:181)
    com.fuyou.servlet.ImageGerator.doGet(ImageGerator.java:96)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    note The full stack trace of the root cause is available in the Apache Tomcat/5.5.25 logs.
    --------------------------------------------------------------------------------Apache Tomcat/5.5.25
      

  9.   

    getWriter()  在哪里用到了/???????????
      

  10.   

    生成servlet没有getWriter( ),我仔细看了!
    package com.fuyou.servlet;import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.Random;import javax.imageio.ImageIO;
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;public class ImageGerator extends HttpServlet { private static final long serialVersionUID = 5688443850114813473L; private static Color getRandColor(int fc, int bc) {
    Random random = new Random();
    if (fc > 255)
    fc = 255;
    if (bc > 255)
    bc = 255;
    int r = fc + random.nextInt(bc - fc);
    int g = fc + random.nextInt(bc - fc);
    int b = fc + random.nextInt(bc - fc);
    return new Color(r, g, b);
    } private static String charsLong = "23456789abcdefghjklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ"; private static String chars = charsLong; public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException { int charsLength = chars.length(); response.setHeader("ragma", "No-cache");
    response.setHeader("Cache-Control", "no-cache");
    response.setDateHeader("Expires", 0); int width = 70, height = 20;
    BufferedImage image = new BufferedImage(width, height,
    BufferedImage.TYPE_INT_RGB);
    Graphics g = image.getGraphics(); Random random = new Random();
    g.setColor(getRandColor(200, 250));//a
    g.fillRect(0, 0, width, height);
    g.setFont(new Font("Times New Roman", Font.ITALIC, height));
    g.setColor(getRandColor(160, 200));//b for (int i = 0; i < 35; i++) {
    int x = random.nextInt(width);
    int y = random.nextInt(height); 
    int xl = random.nextInt(12);
    int yl = random.nextInt(12);
    g.drawLine(x, y, x + xl, y + yl);
    }
    StringBuilder sRand = new StringBuilder();
    String[] fontNames = { "Times New Roman", "Arial", "Book antiqua", "" };
    for (int i = 0; i < 4; i++) {
    g.setFont(new Font(fontNames[random.nextInt(3)], Font.ITALIC,
    height));  
    char rand = chars.charAt(random.nextInt(charsLength));
    sRand.append(rand);
    g.setColor(new Color(20 + random.nextInt(110), 20 + random
    .nextInt(110), 20 + random.nextInt(110)));  //b
    g.drawString(String.valueOf(rand), 16 * i + random.nextInt(6) + 3,
    height - random.nextInt(4)); }
      g.setColor(getRandColor(160, 200));
    for (int i = 0; i < 30; i++) {
    int x = random.nextInt(width);
    int y = random.nextInt(height);
    int xl = random.nextInt(width);
    int yl = random.nextInt(width);
    g.drawLine(x, y, x + xl, y + yl);
    }
    request.getSession().setAttribute("Login_Image_Code", sRand.toString());
    System.out.println(request.getSession().getAttribute("Login_Image_Code").toString()); g.dispose();
    try {
    Thread.sleep(100);
    } catch (Exception ex) {
    }
    RequestDispatcher re = request.getRequestDispatcher("/login.jsp");
    re.forward(request, response);
        OutputStream os = response.getOutputStream();
        ImageIO.write(image, "JPEG", os);
      
       
     
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    }}
      

  11.   

    解决方案:在程序的最后添加:
    out.clear();
    out = pageContext.pushBody(); 
    http://internet.blog.enorth.com.cn/article/227796.shtml