`

JSP验证码getOutputStream的解决方法

阅读更多

http://www.tot.name/show/3/6/20060715135316.htm



使用JSP生成的验证码会报出异常:getOutputStream() has already been called for this response,其原因就是输出流的问题,使用Servlet则解决了此问题以下是代码:


/*
 * 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 
 * @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>
}
分享到:
评论

相关推荐

    jsp 验证码(servlet)

    【JSP验证码(Servlet)详解】 验证码是一种常用的安全机制,用于防止自动化的恶意程序,如机器人,进行非法操作。在Web开发中,JSP(JavaServer Pages)与Servlet结合使用可以实现动态生成并验证验证码的功能。这...

    jsp验证码——数字

    ### jsp验证码——数字 #### 知识点详解 ##### JSP 验证码实现原理与过程 在本文档中,我们关注一个基于JavaServer Pages (JSP) 的数字验证码生成示例。此示例主要涉及到JSP页面的配置、Java图形处理库的使用以及...

    JSP 数字验证码 实现方法

    以下是一个简单的JSP数字验证码的实现方法: 首先,我们来看一下JSP的基本结构。`@%&gt;` 和 `是JSP中的脚本元素,它们分别用于执行Java代码和输出Java表达式的值。在这个例子中,我们主要使用了`@%&gt;`来编写Java代码。...

    JSP验证码+js验证

    **JSP验证码与JavaScript验证详解** 验证码是一种常用的安全机制,用于防止自动化的恶意程序或机器人进行非法操作,如批量注册、刷票等。在Web开发中,Java Server Pages (JSP) 和 JavaScript 是两种常见的技术,...

    getOutputStream() has already been called for this response 错误解决

    在Java Web开发中,"getOutputStream() has already been called for this response" 是一个常见的错误,通常出现在使用Servlet或JSP时。这个错误意味着在HTTP响应中,`getOutputStream()`已经被调用,然后尝试再次...

    JSP验证码(简单版)

    **JSP验证码(简单版)** 验证码是一种常用的安全机制,用于防止自动机器人或者恶意脚本在网站上进行非法操作,如注册、登录、发布信息等。JSP(Java Server Pages)验证码是基于Java技术实现的一种网页验证码。在...

    Jsp验证码源码

    总之,理解和掌握JSP验证码的实现,不仅可以保护你的Web应用免受恶意攻击,还能帮助你更好地理解Web开发中的安全问题。通过下载、学习和实践提供的源码,你将能更深入地理解验证码技术及其在实际项目中的应用。

    JSP验证码实现源代码(4为数字制成图片随机验证)

    在这个特定的案例中,我们关注的是一个JSP验证码的实现,其核心功能是生成4位随机数字并转化为图片进行用户验证。 验证码的主要目的是防止自动化程序(如机器人或恶意脚本)进行非法操作,比如注册、登录或提交表单...

    JSP验证码登录程序

    **JSP验证码登录程序详解** 验证码(CAPTCHA)是一种用于防止自动机器人或恶意脚本进行非法操作的安全机制,常用于用户登录、注册等场景。在JSP(Java Server Pages)中,结合Servlet实现验证码功能,可以有效提升...

    简单实用jsp验证码

    简单实用动态jsp页面验证码 ImageIO.write(image, "JPEG", response.getOutputStream()); }catch(Exception e){ e.printStackTrace(); }

    Jsp图片验证码

    下面我们将详细探讨如何在JSP中创建图片验证码以及验证用户输入的验证码是否正确。 ### 1. 图片验证码的生成原理 图片验证码的基本原理是生成一串随机字符(通常包含字母和数字),将这些字符绘制到一张图片上,...

    JSP验证码实现--解决getOutStream()引发的问题

    在本教程中,我们将探讨如何使用Java Server Pages (JSP)来实现一个简单的验证码功能,同时解决可能出现的`getOutStream()`相关问题。 首先,验证码的目的是确保用户是真实的,而不是自动化程序。它通常要求用户...

    JSP 随机验证码

    总的来说,JSP生成的数字验证码结合了Java的强大功能和网页的交互性,提供了一种简单而有效的用户验证方法。在开发过程中,确保验证码的安全性和用户体验是至关重要的。通过对验证码的不断刷新和复杂化设计,我们...

    jsp随机生成验证码

    本文将深入探讨如何使用JSP(JavaServer Pages)来生成随机验证码。 验证码的核心在于生成难以被机器识别的随机字符串或图像,同时确保服务器端能够正确验证用户输入的验证码。JSP提供了丰富的功能,可以方便地实现...

    利用jsp生成图片验证码

    在本主题“利用jsp生成图片验证码”中,我们将探讨如何在JavaServer Pages (JSP)上下文中创建一个简单的图片验证码,而无需使用Servlet。首先,我们要明白JSP是Java Web开发中的视图层技术,它允许我们在HTML页面中...

    jsp验证码简单示例

    **JSP验证码简单示例** 验证码(CAPTCHA)是一种用于防止自动机器人或恶意脚本进行非法操作的技术。在网页开发中,尤其是用户登录、注册、评论等场景,验证码能够有效地防止垃圾信息的产生,保护网站的安全。JSP...

    JSP实现验证码数字图片

    **JSP实现验证码数字图片详解** 验证码是一种常用的安全机制,用于防止自动机器人或者恶意脚本进行非法操作,如批量注册、频繁提交等。在Web开发中,JSP(JavaServer Pages)可以用来创建动态验证码图片。本文将...

    jsp验证码学习代码

    ### jsp验证码学习代码 #### 一、简介 在web应用程序的安全性方面,验证码是一种常见的保护机制,可以有效防止机器自动填写表单等自动化攻击行为。对于使用Java Server Pages(JSP)技术进行Web开发的技术人员来说...

    基于jsp的验证码自动生成

    在Web开发中,基于JSP(Java Server Pages)的验证码生成系统是常见的实现方式。本文将详细讨论如何使用Java编程语言和JSP技术来创建一个动态验证码生成系统。 首先,我们需要了解JSP的基本概念。JSP是Java的一种...

Global site tag (gtag.js) - Google Analytics