zoukankan      html  css  js  c++  java
  • struts2中的Ajax异步校验

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

    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>
  • 相关阅读:
    深入浅出js单例模式
    前端常见面试-存储/缓存篇
    JavaScript内存管理
    delete操作符
    解决window.location.href跳转无效问题解决办法
    前端程序员经常忽视的一个JavaScript面试题
    【华为云技术分享】漫谈LiteOS-端云互通组件-MQTT开发指南(上)
    【华为云技术分享】序列特征的处理方法之二:基于卷积神经网络方法
    【华为云技术分享】原来CTR预估模型的发展有这样的规律
    【华为云技术分享】在家办公怎么弄?华为云DevCloud宝典一看就懂——项目管理篇
  • 原文地址:https://www.cnblogs.com/nijunyang/p/7640391.html
Copyright © 2011-2022 走看看