`
conkeyn
  • 浏览: 1509196 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

用户登陆,退出等基本Action(1) 验证码

阅读更多

首先需要一个验证码生成的工具类(ConfirmCodeGen.java):

package com.tools;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

/**
 * 生成验证码
 * 
 * @author Michael Young
 * 
 */
public final class ConfirmCodeGen {

	/**
	 * @param response
	 * @param width
	 * @param height
	 * @param len
	 * @return
	 * @throws Exception
	 */
	public static String genImageCode(HttpServletResponse response, int width,
			int height, int len) throws Exception {
		// random number
		String code = Integer.toString((int) (Math.random() * (1E4)));
		for (int i = code.length(); i < len; i++)
			code += "0";
		response.setContentType("image/jpeg");
		response.addHeader("pragma", "NO-cache");
		response.addHeader("Cache-Control", "no-cache");
		response.addDateHeader("Expries", 0);
		BufferedImage image = new BufferedImage(width, height,
				BufferedImage.TYPE_INT_RGB);
		Graphics g = image.getGraphics();
		// 以下填充背景颜色
		g.setColor(Color.WHITE);
		g.fillRect(0, 0, width, height);
		// 画边框
		g.setColor(Color.black);
		g.drawRect(0, 0, width - 1, height - 1);
		// 设置字体颜色
		g.setColor(Color.BLACK);
		// g.setColor(new Color());
		g.setFont(new Font("Times New Roman", Font.BOLD, 16));
		g.drawString(code, 5, 15);
		// 88点
		Random random = new Random();
		for (int i = 0; i < 66; i++) {
			int x = random.nextInt(width);
			int y = random.nextInt(height);
			g.setColor(new Color((int) Math.floor(Math.random() * 255)));
			g.drawLine(x, y, x, y);
		}
		g.dispose();
		ServletOutputStream outStream = response.getOutputStream();
		JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outStream);
		encoder.encode(image);
		outStream.flush();
		outStream.close();
		return code;
	}

	/**
	 * @param session
	 * @param confirmCode
	 * @return
	 */
	public static boolean isCorrectCode(HttpServletRequest request) {
		HttpSession session = request.getSession();
		String confirmCode = request.getParameter("confirmCode");
		if (session.getAttribute("confirmcode") == null || confirmCode == null) {
			return false;
		}
		String code = (String) session.getAttribute("confirmcode");
		// 移除Session
		session.removeAttribute("confirmcode");
		if (code.equals(confirmCode)) {
			return true;
		}
		return false;
	}

	/**
	 * 从ajax判断验证码的正确与否
	 * 
	 * @param confirmCode
	 *            验证码
	 * @param session
	 * @return
	 */
	public static Byte isCorrectCodeFromSession(String confirmCode,
			HttpSession session) {
		if (session.getAttribute("confirmcode") == null || confirmCode == null) {
			return 0;
		}
		String code = (String) session.getAttribute("confirmcode");
		if (code.equals(confirmCode)) {
			return 1;
		}
		// 移除Session
		session.removeAttribute("confirmcode");
		return 0;

	}
}

  2、需要一个自定义的Action的result,(ConfirmCodeGenResult.java):

/**
 * 
 */
package com.web.struts.results;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.dispatcher.StrutsResultSupport;

import com.opensymphony.xwork2.ActionInvocation;
import com.tools.ConfirmCodeGen;

/**
 * title: 生成的验证码的Result
 * 
 * @author conkeyn
 * @时间 2009-4-14:下午02:31:52
 */
public class ConfirmCodeGenResult extends StrutsResultSupport {

	/**  */
	private static final long serialVersionUID = 2545890371747338210L;

	/** 随机图片宽度 */
	private int c_width;

	/** 随机图片高度 */
	private int c_height;

	/** 随机数长度 */
	private int c_length;

	@Override
	protected void doExecute(String finalLocation, ActionInvocation invocation)
			throws Exception {
		HttpServletResponse response = ServletActionContext.getResponse();
		HttpServletRequest request = ServletActionContext.getRequest();
		HttpSession session = request.getSession();
		Object widthO = invocation.getStack().findValue("c_width");
		if (widthO != null) {
			c_width = (Integer) widthO;
			if (c_width <= 0) {
				c_width = 45;
			}
		} else {
			c_width = 45;
		}
		Object heightO = invocation.getStack().findValue("c_height");
		if (heightO != null) {
			c_height = (Integer) heightO;
			if (c_height <= 0) {
				c_height = 20;
			}
		} else {
			c_height = 20;
		}
		Object c_lengthO = invocation.getStack().findValue("c_length");
		if (c_lengthO != null) {
			c_length = (Integer) c_lengthO;
			if (c_length <= 0) {
				c_length = 4;
			}
		} else {
			c_length = 4;
		}
		String random = ConfirmCodeGen.genImageCode(response, c_width,
				c_height, c_length);

		session.setAttribute("confirmcode", random);
	}

	public int getC_width() {
		return c_width;
	}

	public void setC_width(int c_width) {
		this.c_width = c_width;
	}

	public int getC_height() {
		return c_height;
	}

	public void setC_height(int c_height) {
		this.c_height = c_height;
	}

	public int getC_length() {
		return c_length;
	}

	public void setC_length(int c_length) {
		this.c_length = c_length;
	}

}

 3、需要一个默认的action():

package com.web.struts.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

/**
 * 基本Action
 * 
 * 
 * 
 */
public class base extends ActionSupport {
	/**
	 * 
	 */
	private static final long serialVersionUID = -7546749187705748430L;

	/** 验证码的随机图片宽度 */
	protected int c_width;

	/** 验证码的随机图片高度 */
	protected int c_height;

	/** 验证码的随机数长度 */
	protected int c_length;

	public String execute() throws Exception {
		return SUCCESS;
	}


	/**
	 * Convenience method to get the request
	 * 
	 * @return current request
	 */
	protected HttpServletRequest getRequest() {
		return ServletActionContext.getRequest();
	}


	/**
	 * Convenience method to get the response
	 * 
	 * @return current response
	 */
	protected HttpServletResponse getResponse() {
		return ServletActionContext.getResponse();
	}

	/**
	 * Convenience method to get the session
	 */
	protected HttpSession getSession() {
		return getRequest().getSession();
	}

	
	public int getC_width() {
		return c_width;
	}

	public void setC_width(int c_width) {
		this.c_width = c_width;
	}

	public int getC_height() {
		return c_height;
	}

	public void setC_height(int c_height) {
		this.c_height = c_height;
	}

	public int getC_length() {
		return c_length;
	}

	public void setC_length(int c_length) {
		this.c_length = c_length;
	}
}

 配置文件(struts-validation.xml):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" >
<struts>
	<package name="map_validation" extends="struts-default" namespace="/validation">
		<result-types>
			<result-type name="confirmCodeGenResult"
				class="com.web.struts.results.ConfirmCodeGenResult" />
		</result-types>
		<action name="confirm" class="baseAction">
			<result type="confirmCodeGenResult"></result>
		</action>
	</package>
</struts>
 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    新建文本文档.txt

    新建文本文档

    开源Git gui工具Fork

    开源Git gui工具Fork,CSDN能找到教程,但是资料不多,推荐用Tortoise

    yolov5在华为昇腾atlas上加速推理

    该资源为yolov5在华为昇腾atlas上使用Ascend310芯片加速推理,属于c++后端开发,适合C++开发者在华为昇腾盒子上移植深度学习算法的博主们。 资源是demo形式,包含完整的一套代码,还有转好的离线模型文件和跑出的测试结果图片。

    C++ 实现贪吃蛇小游戏

    C++贪吃蛇小游戏简介 内容概要 C++贪吃蛇小游戏是一款经典的2D游戏,它利用C++编程语言结合基本的图形库(如NCurses库或SDL库)实现。游戏的核心玩法包括控制贪吃蛇在封闭的场地内移动,通过吃掉随机出现的食物来增长身体长度,同时避免碰到场地边界或自己的身体,否则游戏结束。游戏界面简洁直观,通过键盘控制贪吃蛇的方向,提供流畅的游戏体验。 适用人群 C++贪吃蛇小游戏适用于广泛的人群,特别是: C++编程学习者:对于正在学习C++编程的学生或爱好者,这款小游戏是一个很好的实践项目。通过实现游戏,可以加深对C++语法、数据结构、面向对象编程等知识点的理解和应用。 使用场景及目标 C++贪吃蛇小游戏可以在以下场景中使用,并达到以下目标: 编程教学实践:在编程教学课堂上,教师可以使用该游戏作为案例,引导学生完成项目的开发。通过实践,学生可以更好地掌握C++编程技能,并将理论知识应用于实际项目中。 个人项目实践:对于个人学习者,实现贪吃蛇小游戏可以作为自我挑战和实践的机会。通过独立完成项目,可以提升自己的编程能力和解决问题的能力。

    ec616DataSheet

    移芯NBIOT 芯片,NB芯片,水表电表芯片,烟感 地磁芯片 超弱信号环境业务能力。

    预测结果.xlsx

    预测结果

    简易java订销管理系统-javainfo

    简易java订销管理系统_javainfo,包含全量功能源码,及相关文档说明,供大家学习使用!!!

    Java开发案例-springboot-52-POI导出Excel-源代码+文档.rar

    Java开发案例-springboot-52-POI导出Excel-源代码+文档.rar Java开发案例-springboot-52-POI导出Excel-源代码+文档.rar Java开发案例-springboot-52-POI导出Excel-源代码+文档.rar Java开发案例-springboot-52-POI导出Excel-源代码+文档.rar Java开发案例-springboot-52-POI导出Excel-源代码+文档.rar Java开发案例-springboot-52-POI导出Excel-源代码+文档.rar

    附件1预测.xlsx

    附件1预测

    基于java的习题检索系统源码.zip

    提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

    Java开发案例-springboot-31-实现快递物流查询(快递鸟)-源代码+文档.rar

    Java开发案例-springboot-31-实现快递物流查询(快递鸟)-源代码+文档.rar Java开发案例-springboot-31-实现快递物流查询(快递鸟)-源代码+文档.rar Java开发案例-springboot-31-实现快递物流查询(快递鸟)-源代码+文档.rar Java开发案例-springboot-31-实现快递物流查询(快递鸟)-源代码+文档.rar Java开发案例-springboot-31-实现快递物流查询(快递鸟)-源代码+文档.rar Java开发案例-springboot-31-实现快递物流查询(快递鸟)-源代码+文档.rar Java开发案例-springboot-31-实现快递物流查询(快递鸟)-源代码+文档.rar Java开发案例-springboot-31-实现快递物流查询(快递鸟)-源代码+文档.rar

    测试手柄以及其他外设在安卓模拟器或者安卓手机上的操作按键以及使用的摇杆向量

    测试手柄以及其他外设在安卓模拟器或者安卓手机上的操作按键以及使用的摇杆向量,通过按键以及摇杆来识别手柄或者其他外设的操作按键以及摇杆等。

    第一篇20240528_00.png

    第一篇20240528_00.png

    基于Java的实用的音乐软件微信小程序的设计与开发源码.zip

    提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

    使用SAHI模块完成超分辨率以及小目标检测是应用示例python源码+项目说明

    使用SAHI模块完成超分辨率以及小目标检测是应用示例python源码+项目说明个人经导师指导并认可通过的高分设计项目,评审分98分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 使用SAHI模块完成超分辨率以及小目标检测是应用示例python源码+项目说明个人经导师指导并认可通过的高分设计项目,评审分98分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。使用SAHI模块完成超分辨率以及小目标检测是应用

    第二次操作系统作业等9个文件.zip

    第二次操作系统作业等9个文件.zip

    C++ 控制台版本坦克大战游戏

    C++ 控制台版坦克大战游戏简介 内容概要 C++ 控制台版坦克大战游戏是一款基于C++编程语言开发的经典射击游戏。 通过键盘控制坦克移动攻击,躲避敌方坦克的攻击,同时消灭它们以完成关卡任务,支持地图编辑。 适用人群 这款游戏适用于对C++编程和游戏开发感兴趣的广大学生、编程爱好者以及初学者。通过参与游戏开发,他们可以深入了解C++编程语言的应用,学习游戏逻辑设计、用户输入处理。此外,对于想要通过实践提升编程能力和算法思维的人群,这款游戏也是一个不错的选择。 使用场景及目标 C++ 控制台版坦克大战游戏可以在多种场景下使用,并达到以下目标: 学习与实践场景:在编程学习或实践课程中,教师可以利用这款游戏作为教学案例,引导学生逐步完成游戏的开发。学生在开发过程中将学习并应用C++的基础知识,包括变量、数据类型、循环、条件语句等,同时培养解决问题的能力。

    程序设计java.rar

    程序设计java.rar

    ipywidgets-7.7.0.tar.gz

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    Python国外某书店顾客购书金额数据分析 图书单词词频 地理坐标分析

    Python国外某书店顾客购书金额数据分析 图书单词词频 地理坐标分析

Global site tag (gtag.js) - Google Analytics