JSP中的验证码

login.jsp

<span style="font-size:14px;"><%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<html>
  <head>
    <script>
  	function mySubmit(){
  		document.forms[0].submit();
  	}
  	function myChange(){
  		document.getElementById("codeImage").src="codeImage.jsp?"+Math.random();
  	}
  </script>
   <%
  	String msg=(String)session.getAttribute("error_msg");
  	msg=msg==null?"":msg;
   %>
  <h1><%=msg%></h1>
  <%session.removeAttribute("error_msg"); %>
  </head>
  
  <body>
   <form action="dologin.jsp" method="post">
		用户名:<input type="text" name="name"/><br>
		验证码:<input type="text" name="code"/>
		<img id="codeImage" src="codeImage.jsp">
		<a href="#" οnclick="myChange()">看不清</a>
		<a href="javascript:myChange()">看不清</a><br>
		<br><input type="button" value="登录" οnclick="mySubmit()"/>
	</form>
  </body>
</html></span>
绘制验证码 

codeImage.jsp

<span style="font-size:14px;"><%@ page import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="java.awt.image.BufferedImage" %>
<%@ page import="java.awt.Graphics" %>
<%@ page import="java.awt.Color" %>
<%@ page import="java.awt.Font" %>
<%@ page import="javax.imageio.ImageIO" %>
<%
	//绘图
	
	//产生验证码
	char[] chs={'A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R',
	'S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k',
	'm','n','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5',
	'6','7','8','9'};
	String code="";
	Random rd=new Random();
	for(int i=0;i<4;i++){
		code=code+chs[rd.nextInt(chs.length)];
	}
	//将验证码保存起来,以便和用户输入的验证码比对
	session.setAttribute("oldCode", code);
	
	//创建画板
	BufferedImage bufferImage=new BufferedImage(80,30,BufferedImage.TYPE_INT_RGB);
	//获取用于绘图的画笔
	Graphics g=bufferImage.getGraphics();
	//为画笔上色,首先绘制背景
	g.setColor(Color.YELLOW);
	//用画笔将背景填充满
	g.fillRect(0,0, 80, 30);
	//更换画笔颜色,准备绘制文字
	g.setColor(Color.BLUE);
	//设置字体
	g.setFont(new Font("宋体",Font.PLAIN,30));
	//用画笔绘制验证码
	g.drawString(code, 10,23);
	//图片已经画好,接下来生成然后响应给浏览器显示
	ServletOutputStream os=response.getOutputStream();
	ImageIO.write(bufferImage, "jpeg", os);
	os.flush();
 %></span>
对登陆页面进行后台处理

dologin.jsp

<span style="font-size:14px;"><%@ page import="java.util.*" pageEncoding="UTF-8"%>
<%
	//获取提交的用户名,然后将用户名存放到当前用户所属的Session对象中
	request.setCharacterEncoding("UTF-8");
	
	//判断验证码是否正确
	String inputCode=request.getParameter("code");
	String oldCode=(String)session.getAttribute("oldCode");
	if(!inputCode.equalsIgnoreCase(oldCode)){
		session.setAttribute("error_msg", "验证码错误");
		response.sendRedirect("index.jsp");
	}else{
	   String name=request.getParameter("name");
	   session.setAttribute("user_name", name);
	   response.sendRedirect("welcome.jsp"); 
	}
	
 %></span>
验证码正确进入欢迎页面

welocme.jsp

<span style="font-size:14px;"><%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%  request.setCharacterEncoding("UTF-8");
    String name=(String)session.getAttribute("user_name");
	
	 %>

  <head>
  </head>
  <body>
    <%=name %>登陆成功,欢迎来到首页
  </body>
</html></span>
功能实现,但是控制台会报异常:

严重: Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
    at org.apache.catalina.connector.Response.getWriter(Response.java:604)
    at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198)
    at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
    at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
    at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:186)
    at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:118)
    at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:77)
    at org.apache.jsp.codeImage_jsp._jspService(codeImage_jsp.java:108)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Thread.java:619)

未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值