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)
未完待续