JSP驗證碼getOutputStream異常的解決方法

<table bgcolor="#EB9A2C" border="0">

<tr>

<td>

/*
 * Image.java
 *
 * Created on 2006年7月13日, 下午4:43
 */

package com.tot.certcode;

import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.awt.*;
import java.awt.image.*;
import java.util.*;
import javax.imageio.*;
/**
 *
 * @author http://www.tot.name
 * @version
 */
public class Image extends HttpServlet {
   
    /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("image/jpeg");
        response.setHeader("Pragma","No-cache");
        response.setHeader("Cache-Control","no-cache");
        response.setDateHeader("Expires", 0);      
        HttpSession session=request.getSession();
        // 在內存中創建圖象
        int width=60, 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));
        g.fillRect(0, 0, width, height);
       
        //設定字體
        g.setFont(new Font("Times New Roman",Font.PLAIN,18));
       
        //畫邊框
        //g.setColor(new Color());
        //g.drawRect(0,0,width-1,height-1);
       
       
        // 隨機產生155條幹擾線,使圖象中的認證碼不易被其它程序探測到
        g.setColor(getRandColor(160,200));
        for (int i=0;i<155;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);
        }
       
        // 取隨機產生的認證碼(4位數字)
        String sRand="";
        for (int i=0;i<4;i++){
            String rand=String.valueOf(random.nextInt(10));
            sRand+=rand;
            // 將認證碼顯示到圖象中
            g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//調用函數出來的顏色相同,可能是因爲種子太接近,所以只能直接生成
            g.drawString(rand,13*i+6,16);
        }
       
        // 將認證碼存入SESSION
        session.setAttribute("rand",sRand);
        // 圖象生效
        g.dispose();
        ServletOutputStream responseOutputStream =response.getOutputStream();
        // 輸出圖象到頁面
        ImageIO.write(image, "JPEG", responseOutputStream);

        //以下關閉輸入流!
        responseOutputStream.flush();
        responseOutputStream.close();
    }
    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);
    }
    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }
   
    /** Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }
   
    /** Returns a short description of the servlet.
     */
    public String getServletInfo() {
        return "Short description";
    }
    // </editor-fold>
}


</td>

</tr>

</table>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章