登录时验证码的异步校验:

1.验证码生成的是图片因此在struts.xml文件里面配置action 时,result标签中type 属性是stream

2.验证码图片的src的值为配置action名字:

3.登录处理的action里面需要有一个对应的JSONObject 类型的成员变量

4.struts.xml里面配置异步请求的action,pakage需要继承json-default;result标签中type 属性是josn;

param标签的name属性为root,还有个后处理器,对结果进行处理,

如果自己定义name的话,需要注意返回的josn'格式再获取值:

验证码action:

package ni.jun.yang.action;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.Random; import javax.imageio.ImageIO;
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; public class CreateImageAction extends ActionSupport{ private static final long serialVersionUID = 1L; private ByteArrayInputStream inputStream; private static int WIDTH = 60; private static int HEIGHT = 20; public ByteArrayInputStream getInputStream()
{
return inputStream;
} public void setInputStream(ByteArrayInputStream inputStream)
{
this.inputStream = inputStream;
} private static String createRandom()
{
String str = "0123456789qwertyuiopasdfghjklzxcvbnm"; char[] rands = new char[4]; Random random = new Random(); for (int i = 0; i < 4; i++)
{
rands[i] = str.charAt(random.nextInt(36));
} return new String(rands);
} private void drawBackground(Graphics g)
{
// 画背景
g.setColor(new Color(0xDCDCDC)); g.fillRect(0, 0, WIDTH, HEIGHT); // 随机产生 120 个干扰点 for (int i = 0; i < 120; i++)
{
int x = (int) (Math.random() * WIDTH); int y = (int) (Math.random() * HEIGHT); int red = (int) (Math.random() * 255); int green = (int) (Math.random() * 255); int blue = (int) (Math.random() * 255); g.setColor(new Color(red, green, blue)); g.drawOval(x, y, 1, 0);
}
} private void drawRands(Graphics g, String rands)
{
g.setColor(Color.BLACK); g.setFont(new Font(null, Font.ITALIC | Font.BOLD, 18)); // 在不同的高度上输出验证码的每个字符 g.drawString("" + rands.charAt(0), 1, 17); g.drawString("" + rands.charAt(1), 16, 15); g.drawString("" + rands.charAt(2), 31, 18); g.drawString("" + rands.charAt(3), 46, 16); System.out.println(rands); } @Override
public String execute() throws Exception
{
HttpServletResponse response = ServletActionContext.getResponse();
// HttpServletRequest request = ServletActionContext.getRequest();
// HttpSession session = request.getSession();
// 设置浏览器不要缓存此图片
response.setHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); String rands = createRandom(); BufferedImage image = new BufferedImage(WIDTH, HEIGHT,
BufferedImage.TYPE_INT_RGB); Graphics g = image.getGraphics(); // 产生图像
drawBackground(g); drawRands(g, rands); // 结束图像 的绘制 过程, 完成图像
g.dispose(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ImageIO.write(image, "jpeg", outputStream); ByteArrayInputStream input = new ByteArrayInputStream(outputStream
.toByteArray()); this.setInputStream(input); HttpSession session = ServletActionContext.getRequest().getSession();
session.setMaxInactiveInterval(120); //设置验证码有效时间120s
session.setAttribute("checkCode", rands); input.close(); outputStream.close(); return SUCCESS;
} }

验证码xml配置:

<action name="checkimage" class="ni.jun.yang.action.CreateImageAction">
<result name="success" type="stream"></result>
</action>

页面jsp代码:

<%@ page language="Java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@taglib uri="/struts-tags" prefix = "s" %>
<!DOCTYPE HTML >
<html>
<head>
<base href="<%=basePath%>">
<title>登录</title>
<meta charset="utf-8">
<script src="jquery-3.2.1.min.js"></script>
</head>
<body>
<script>
$(function(){ $("#check").blur(function(){ var checkcode = $(this).val();
alert(checkcode);
$.ajax({
url:"checkimage1",
data:{check:checkcode},
type:"post",
dataType:"json",
success:function(result){
alert(result.result);
}
});
});
}); </script> <s:form action="loginaction" theme="simple">
帐户:<s:textfield name = "userName"></s:textfield><br/>
密码:<s:password name = "psw"></s:password><br/>
验证码:<img src="checkimage"><s:textfield name = "check" id="check"></s:textfield><br/>
<s:submit value="登录"></s:submit>
</s:form> </body>
</html>

登录处理action:

package ni.jun.yang.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionContext; import net.sf.json.JSONObject;
import ni.jun.yang.service.LoginService;
import ni.jun.yang.bean.User;
import ni.jun.yang.service.*; public class LoginAction {
private String userName;
private String psw;
private String check;
private JSONObject result;
public LoginAction() { } public JSONObject getResult() {
return result;
} public void setResult(JSONObject result) {
this.result = result;
} public String getCheck() {
return check;
} public void setCheck(String check) {
this.check = check;
} public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPsw() {
return psw;
}
public void setPsw(String psw) {
this.psw = psw;
} public String execute(){ // HttpServletRequest request = ServletActionContext.getRequest();
// String xString = request.getParameter("userName");
// System.out.println("请求获取:"+xString);
// System.out.println("--------");
// System.out.println("参数封装:"+userName);
//
// request.setAttribute("userName", userName);
// LoginService ls = new LoginService();
String checkCode = (String) ActionContext.getContext().getSession().get("checkCode");
if(check.equals(checkCode)){
IUserService ius = new UserServiceImpl();
User user1 = new User();
user1.setUserName(userName);
user1.setUserPsw(psw);
User user = ius.selectUser(user1);
System.out.println(user.getUserSex());
if(user != null){
HttpSession session = ServletActionContext.getRequest().getSession();
session.setMaxInactiveInterval(30*60); //登录成功设置session时间1800s
return "success";
}else{
return "fail";
}
}else{
return "fail";
}
} public String execute1(){ // ajax 异步验证验证码
String checkCode = (String) ActionContext.getContext().getSession().get("checkCode");
result = new JSONObject();
if(check.equals(checkCode)){
result.accumulate("result", "正确!");
}else{
result.accumulate("result", "错误!");
} return "success";
} }

ajax请求的xml配置:

<package name="mystrusts1" extends="json-default" namespace="/">
<action name="checkimage1" class="ni.jun.yang.action.LoginAction" method="execute1">
<result name="success" type="json">
<param name="root">result</param>
</result>
</action>
</package>

struts2中的Ajax异步校验的更多相关文章

  1. SSH实战 · AJAX异步校验

    前台JS代码 /*异步验证用户名的输入格式以及是否存在*/ function CheckUsername(){      /*取到用户名输入框*/      var nametxt = documen ...

  2. 利用ajax异步校验验证码(转)

    利用ajax异步校验验证码 示例结果如图所示 具体步骤如下: step1: jsp页面及js脚本 <%@page pageEncoding="utf-8" contentTy ...

  3. For循环中由于ajax异步导致的问题解决(增加alert数据正常,去掉alert之后数据错误)

    由于ajax异步请求的机制,for循环运行不会等内部ajax请求结束,而直接循环到最后.解决方法:将for循环里面的请求单独封装一个方法. 个人遇到的问题具体如下 下面这段代码,如果第5行studat ...

  4. 问答项目---登陆账号密码登陆做AJAX异步校验

    异步验证管理员帐号方法: /* 异步验证管理员帐号 */ public function checkAccount(){ if(!IS_AJAX){echo "页面不存在";die ...

  5. Struts2中通过Ajax传递json数据

    1.导入Struts2所需要的jar包 下载Struts2的jar包时,可以下载struts-2.5.13-min-lib.zip,然后放到项目的/WebContent/WEB-INF/lib路径下s ...

  6. 在struts2中整合ajax时出现Template /template/ajax/head.ftl not found错误时的处理方法

    Struts2 Ajax出现错误“Template /template/ajax/head.ftl not found” 2013-02-08 18:26:27|  分类: 默认分类|字号 订阅   ...

  7. Vue--axios:vue中的ajax异步请求(发送和请求数据)、vue-resource异步请求和跨域

    跨域原理: 一.使用axios发送get请求 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 & ...

  8. (转)函数中使用 ajax 异步 同步 返回值错误 主函数显示返回值总是undefined -- ajax使用总结

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAloAAAE0CAIAAAB7LwoKAAAgAElEQVR4nO2dy6sc152A6+/R2mXwSn ...

  9. prototype中的ajax异步加载

    jquery前台处理: var param = {a:a}; $.post("*.do",param,function(data) { var columHtml = " ...

随机推荐

  1. Grails笔记一:windows8.1操作系统cmd下grails命令无效

    最近决定使用intellij idea工具来开发基于Grails框架的应用程序,,在安装好jdk 1.7以及配置好jdk和grails环境变量后进行grails测试,在win8.1的命令行窗口中输入以 ...

  2. 第2阶段——编写uboot之编译测试以及改进(3)

    编译测试: 1.将写好的uboot复制到linux下面 2.make编译,然后将错误的地方修改,生成boot.bin (编译出错的解决方案:http://www.cnblogs.com/lifexy/ ...

  3. hdu 3722 二分图 最优完备匹配 KM算法

    这题只要想到是最优完备匹配就行了: 题意:给出n个字符串,若两两相连,将前一个反置添加到后一个后面,相连的值为两个字串从头开始相等的字符个数: 问如何匹配得出最大值: 思路:建图,套模板. 代码: # ...

  4. hdu 3062 2-Sat入门

    开始学习2-Sat,前面看了对称性解决2-sat的ppt,很有帮助. 题意:n对夫妻,夫妻需要出席一人,给出不相容的关系,求每对是否能完成出席方案. 思路:通过关系建图,Tarjan缩点,然后进行判断 ...

  5. 关于SCSI/SATA/IDE硬盘的比较

    看linux的书时,发现许多地方提到SCSI/SATA/IDE这几种硬盘接口,对这些硬盘的概念和区别感到很模糊.所以特意查了一些资料,基本上算是弄懂了他们的区别. 目前硬盘最要分为3种.也即:IDE. ...

  6. 201521123007《Java程序设计》第7周学习总结

    1. 本周学习总结 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 以下是ArrayList的contains源代码: public bool ...

  7. 201521123100 《Java程序设计》 第7周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 参考资料: XMind 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代 ...

  8. 201521123095 《Java程序设计》第7周学习总结

    1. 本章学习总结 **2. 书面作业* 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 该源代码验证该ArrayList中是否包含某个对象,contains的 ...

  9. 201521123105 第9周Java学习总结

    1. 本周学习总结 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避 ...

  10. Java课程设计—学生成绩管理系统(201521123004-林艺如)

    1.团队课程设计博客 团队课程设计博客链接 2.个人负责模块或任务说明 ①.Menu Menu.jsp 在页面中给出提示,用HTML的 MenuTeacher.jsp 利用Menu.jsp进行具体化完 ...