本文共 3658 字,大约阅读时间需要 12 分钟。
首先是用一个servlet :ImageServlet.java产生验证码并将验证字符串存到session里。
package servlet;import java.awt.Color;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.IOException;import java.util.Random;import javax.imageio.ImageIO;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class ImageServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置页面不缓存 response.setHeader("Pragma", "No-cache"); response.setHeader("Cache", "no-cache"); response.setDateHeader("Expires", 0); // 在内存中创建图像 int width = 60; int height = 20; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics g = image.getGraphics(); Random random = new Random(); g.setColor(new Color(0, 0, 100)); g.fillRect(0, 0, width, height); String sRand = ""; for (int i = 0; i < 4; i++) { String rand = String.valueOf(random.nextInt(10)); sRand += rand; g.setColor(new Color(30 + random.nextInt(160), 40 + random .nextInt(170), 40 + random.nextInt(180))); g.drawString(rand, 13 * i + 6, 16); // 绘制 } request.getSession().setAttribute("yzm", sRand); // 验证码存入session g.dispose(); // 输出图像 ImageIO.write(image, "JPEG", response.getOutputStream()); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); }}然后在web.xml里把这个servlet 的URL设置成getImage 然后是JSP
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%><% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";%>acton= main中的main是一个随便写的servlet ,由于要用filter验证验证码,所以如果能访问到这个servlet 则证明验证码正确。My JSP 'Login.jsp' starting page 验证码ImageServlet测试
yanzhengmaFilter.java
package Filter;import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class yanzhengmaFilter implements Filter { @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub HttpServletRequest req = (HttpServletRequest) request;// 转换之后才可以获取sesson HttpServletResponse res = (HttpServletResponse)response; String useryzm = request.getParameter("yzm"); String sysyzm = null; try { sysyzm = req.getSession().getAttribute("yzm").toString(); } catch (Exception e) { response.setCharacterEncoding("gbk"); PrintWriter out = response.getWriter(); out.println(""); res.sendRedirect("login.jsp"); return; } if (sysyzm.equals(useryzm) && sysyzm != null) { chain.doFilter(request, response); } else { response.setCharacterEncoding("gbk"); PrintWriter out = response.getWriter(); out.println(""); res.sendRedirect("login.jsp"); return; } } @Override public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub }}在web.xml里把这个过滤器加进去 然后设置当访问main这个servlet时进行验证就行了。
转载地址:http://hgyvb.baihongyu.com/