精华内容
下载资源
问答
  • 我们大家再进行web开发的时候,必不可少会遇见表单重复提交问题。来给总结如何解决表单提交问题,欢迎大家交流指正。  首先我们在讨论如何解决表单重复提交问题之前先来解决三个问题:1.什么叫表单重复提交?2.什么...
  • 当前位置:我的异常网» Java Web开发»struts2 提交表单 第一次提交null 后退页面在提交struts2 提交表单 第一次提交null 后退页面在提交 可以赋值,如何解决www.myexceptions.net网友分享于:2013-09-12浏览:72次...

    当前位置:我的异常网» Java Web开发 » struts2 提交表单 第一次提交null 后退页面在提交

    struts2 提交表单 第一次提交null 后退页面在提交 可以赋值,如何解决

    www.myexceptions.net  网友分享于:2013-09-12  浏览:72次

    struts2 提交表单 第一次提交null 后退页面在提交 可以赋值,怎么解决

    type Exception report

    message

    description The server encountered an internal error () that prevented it from fulfilling this request.

    exception

    java.lang.NullPointerException

    com.pet.action.Pupetinfo.PupetinfoAction.add(PupetinfoAction.java:97)

    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

    java.lang.reflect.Method.invoke(Method.java:597)

    com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:452)

    com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:291)

    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:254)

    com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)

    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)

    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)

    com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:263)

    org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)

    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)

    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)

    com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:133)

    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)

    com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)

    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)

    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)

    com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)

    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)

    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)

    com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:190)

    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)

    org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)

    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)

    org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)

    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)

    org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:243)

    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)

    com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)

    * 添加发布信息

    * @return

    * @throws IOException

    */

    public String add() throws IOException{

    //添加数据库

    Customer customer = (Customer) session.get("customer");

    pu.setCustomer(customer);

    System.out.println("ffffffffffff");

    totalinfo = pupetinfoDao.querybycustomerId(customer.getCustomerId());//每天发布的免费信息数量

    bymoney = pupetinfoDao.querybymoneyinfo(customer.getCustomerId());//发布的收费信息数量

    totalinfos = pupetinfoDao.querybycustomerIdDay(customer.getCustomerId());//总共发布的免费信息数量

    if(pu.getInfotype().getInfotypeId()==1){ //如果是免费信息

    文章评论

    展开全文
  • 一、什么是表单重复提交 当我们在淘宝购物的时候,在付款的最后一步,也就是在表单输入密码提交后,系统完成扣钱并返回支付成功信息给前台。 当然我们看到的时候,页面跳转到了支付成功页面,而不是在当前页面做的...

    一、什么是表单重复提交

    当我们在淘宝购物的时候,在付款的最后一步,也就是在表单输入密码提交后,系统完成扣钱并返回支付成功信息给前台。
    当然我们看到的时候,页面跳转到了支付成功页面,而不是在当前页面做的响应。这其实是因为淘宝已经做了防止重复提交的应对机制。
    但是最初大家开发网页的时候,都用的是最简单的请求-响应方式。浏览器的地址是不变的,表单数据也存在缓存之中。此时如果做一些表单重复提交的操作,如果后台不验证订单是否已经付款的话,我们可能就会重复付钱给淘宝了。这当然是一个BUG。

    有几种方式呢?
    1.重复点击了提交按钮(可能是由于网络延迟,我们还没收到响应的时候又着急点击了提交)
    2.提交成功后,点击了浏览器的refresh按钮
    3.浏览器前进或后退方式,重复执行了uri
    4.其他种种导致上一次http重新被请求了

    二、解决方案

    1.首先我们会想到在js端控制
    当用户点击提交按钮过后,通过javascript脚本控制按钮在收到响应之前不可再被点击。
    这是前端控制方案,对一个有良好用户体验的网站,这个控制是必须要做到的。
    缺点是:网页刷新或者前进、后退导致的刷新一样会重复提交表单。

    2.表单提交成功后,后台不直接返回响应,而是通过重定向的方式,让客户端重新请求成功的页面
    这种方式被称为Post/Redirect/Get方式,简称为PRG。 PRG是一种web开发设计模式。该模式的主要作用就是为了防止表单重复提交问题。该种方式解决了网页刷新和前进、后退导致的重复提交问题。
    缺点是:由于服务器延迟,导致的用户多次提交问题还是不能避免。

    对于一般用户而言,结合上两种情况,基本可以保证避免重复提交问题。首先任何情况下用javascript控制提交按钮只能响应一次,其次是提交成功后,使用重定向方式,使前端重新请求其他成功页面。
    如果某个用户,在提交后,由于网络问题,发现等待很久,而提交按钮此时不可用,然后他选择了点击浏览器刷新按钮(一般用户不会这样干的)想试试能不能改变这种网络状况的时候,重复提交的问题就又出现了。(不过这个说法有待商榷,经测试,当后台一直处于响应中的状态时,chrome浏览器的refresh按钮是变成X的,显示的是停止加载此页,那么此时停止后,页面并没有提交到后台呢,还是在原来的页面)

    3.100%解决重复提交问题
    需要服务端和客户端联合编程完全解决重复提交问题。即采用token机制。
    在服务器端session保存唯一token,并在生成表单页面时,将该token以隐藏表单域的方式记录在前端,当表单提交时候,用服务端session和提交的token比对,如果一致,则是第一次提交,清空服务器端session的token。
    则如果重复提交的话,服务器端session和提交的token是不一致的。如此,便可判断表单是否重复提交。


    参考资料:
    Post/Redirect/Get
    服务器端防止表单重复提交

    转载于:https://www.cnblogs.com/braveliuever/p/5808767.html

    展开全文
  • 问卷/表格Web App 安装 npm install npm start 在网络浏览器中打开http://localhost:8080 主要特点 从JSON文件填充表单页面 如果“表单”表中存在表单,则将有该表单的ID和一个包含表单名称和问题的JSON文件。 该...
  • 绝对路径:相对于当前WEB应用的的根路径,路径都带上contextPath ...表单的重复提交 1、表单提交到一个servlet,servlet转发到一个jsp页面,而浏览器地址还是servlet的路径,在相应页面刷新 2、在相应页面还没有到

    绝对路径:相对于当前WEB应用的的根路径,路径都带上contextPath
    http://localhost:8080/day01/a.jsp 绝对
    http://localhost:8080/a.jsp 错误

    web中的/代表啥?
    这里写图片描述

    表单的重复提交

    1、表单提交到一个servlet,servlet转发到一个jsp页面,而浏览器地址还是servlet的路径,在相应页面刷新
    2、在相应页面还没有到达时,重复点击提交按钮
    3、点击返回,在点击提交

    <在原表单页面中,生成一个随机的token,将其放入到session属性(setAttribute)和隐藏域中(hidden)
    <在目标servlet中,获取session值和隐藏域中的token值
    <如果2个值一致,受理请求,并把session域中的token属性清除,若不一致,则提示重复提交

    index.jsp

    <body>
        <%
            String tokenValue = new Date().getTime() + "";
            session.setAttribute("token", tokenValue );
        %>
        <form action="<%=request.getContextPath()%>/tokenServlet"
            method="post">
            <input type="hidden" name="token" value="<%=tokenValue%>" /> 
            name:<input type="text" name="name" /> 
                 <input type="submit" value="Submit" />
        </form>
    </body>
    

    TokenServlet

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            HttpSession session = request.getSession();
            Object token = session.getAttribute("token");
    
            String tokenValue = request.getParameter("token");
    
            System.out.println(token);
            System.out.println(tokenValue);
    
            if (token != null && token.equals(tokenValue)) {
                session.removeAttribute("token");
            }else{
                response.sendRedirect(request.getContextPath()+"/token/token.jsp");
                return;
            }
            String name = request.getParameter("name");
            System.out.println("name:"+name);
    
            response.sendRedirect(request.getContextPath()+"/token/success.jsp");
        }
    

    success.jsp中是提示 成功的一句话
    token.jsp中是提示重复提交

    http://localhost:8080/day01/token/index.jsp
    这里写图片描述

    http://localhost:8080/day01/token/success.jsp
    这里写图片描述

    http://localhost:8080/day01/token/token.jsp
    这里写图片描述

    如果返回到http://localhost:8080/day01/token/index.jsp页面,在提交前,进行刷新页面,在输入值,进行提交,不算重复请求,因为又是一个新的请求

    表单的重复提交,代码升级
    我们可以将来token != null && token.equals(tokenValue)逻辑放到一个类中统一实现

    TokenProcessor这个实现原理跟楼上的例子本质是一样的,也是请求后,移除 session.removeAttribute(“token”);

    package com.safly;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    public class TokenProcessor {
        private static final String TOKEN_KEY = "TOKEN_KEY";
        private static final String TRANSACTION_TOKEN_KEY = "TRANSACTION_TOKEN_KEY";
        private static TokenProcessor instance = new TokenProcessor();
        private long previous;
        protected TokenProcessor() {
            super();
        }
    
        public static TokenProcessor getInstance() {
            return instance;
        }
        public synchronized boolean isTokenValid(HttpServletRequest request) {
            return this.isTokenValid(request, false);
        }
        public synchronized boolean isTokenValid(HttpServletRequest request,
                boolean reset) {
            HttpSession session = request.getSession(false);
    
            if (session == null) {
                return false;
            }
            String saved = (String) session.getAttribute(TRANSACTION_TOKEN_KEY);
            if (saved == null) {
                return false;
            }
            if (reset) {
                this.resetToken(request);
            }
            String token = request.getParameter(TOKEN_KEY);
    
            if (token == null) {
                return false;
            }
            return saved.equals(token);
        }
        public synchronized void resetToken(HttpServletRequest request) {
            HttpSession session = request.getSession(false);
            if (session == null) {
                return;
            }
            session.removeAttribute(TRANSACTION_TOKEN_KEY);
        }
        public synchronized String saveToken(HttpServletRequest request) {
            HttpSession session = request.getSession();
            String token = generateToken(request);
            if(token != null) {
                session.setAttribute(TRANSACTION_TOKEN_KEY, token);
            }
            return token;
        }
        public synchronized String generateToken(HttpServletRequest request) {
            HttpSession session = request.getSession();
            return generateToken(session.getId());
        }
        public synchronized String generateToken(String id) {
            try {
                long current = System.currentTimeMillis();
                if (current == previous) {
                    current++;
                }
                previous = current;
                byte[] now = new Long(current).toString().getBytes();
                MessageDigest md = MessageDigest.getInstance("MD5");
                md.update(id.getBytes());
                md.update(now);
                return toHex(md.digest());
            } catch (NoSuchAlgorithmException e) {
                return null;
            }
        }
        private String toHex(byte[] buffer) {
            StringBuffer sb = new StringBuffer(buffer.length * 2);
            for (int i = 0; i < buffer.length; i++) {
                sb.append(Character.forDigit((buffer[i] & 0xf0) >> 4, 16));
                sb.append(Character.forDigit(buffer[i] & 0x0f, 16));
            }
            return sb.toString();
        }
    }
    

    index.jsp

    <body>
        <form action="<%=request.getContextPath()%>/tokenServlet"
            method="post">
            <input type="hidden" name="TOKEN_KEY" value="<%=TokenProcessor.getInstance().saveToken(request)%>" /> 
            name:<input type="text" name="name" /> 
                 <input type="submit" value="Submit" />
        </form>
    </body>

    TokenServlet

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            boolean tokenValid = TokenProcessor.getInstance().isTokenValid(request);
            if (tokenValid) {
                TokenProcessor.getInstance().resetToken(request);   
            }else{
                response.sendRedirect(request.getContextPath()+"/token/token.jsp");
                return;
            }
            String name = request.getParameter("name");
            System.out.println("name:"+name);
            response.sendRedirect(request.getContextPath()+"/token/success.jsp");
        }
    

    验证码
    验证码是经常见得,它其实没有那么神秘,跟表单重复提交的实现原理相似

    index.jsp

    <body>
        <font color="red">
            <%= session.getAttribute("message") == null ? "" : session.getAttribute("message")%>
        </font>
        <form action="<%= request.getContextPath() %>/checkCodeServlet" method="post">
            name: <input type="text" name="name"/>
            checkCode: <input type="text" name="CHECK_CODE_PARAM_NAME"/> 
            <img alt="" src="<%= request.getContextPath() %>/validateColorServlet"> 
            <input type="submit" value="Submit"/>
        </form>
    </body>

    CheckCodeServlet

    package com.safly;
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class CheckCodeServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
            //1. 获取请求参数: CHECK_CODE_PARAM_NAME
            String paramCode = request.getParameter("CHECK_CODE_PARAM_NAME");
    
            //2. 获取 session 中的 CHECK_CODE_KEY 属性值
            String sessionCode = (String)request.getSession().getAttribute("CHECK_CODE_KEY");
    
            System.out.println(paramCode);
            System.out.println(sessionCode); 
    
            //3. 比对. 看是否一致, 若一致说明验证码正确, 若不一致, 说明验证码错误
            if(!(paramCode != null && paramCode.equals(sessionCode))){
                request.getSession().setAttribute("message", "验证码不一致!");
                response.sendRedirect(request.getContextPath() + "/check/index.jsp");
                return;
            }   
            System.out.println("受理请求!");
        }
    }
    

    ValidateColorServlet

    package com.safly; 
    
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.util.Random;
    
    import javax.imageio.ImageIO;
    import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class ValidateColorServlet extends HttpServlet {
    
        public static final String CHECK_CODE_KEY = "CHECK_CODE_KEY";
    
        private static final long serialVersionUID = 1L;
    
        //设置验证图片的宽度, 高度, 验证码的个数
        private int width = 152;
        private int height = 40;
        private int codeCount = 6;
    
        //验证码字体的高度
        private int fontHeight = 4;
    
        //验证码中的单个字符基线. 即:验证码中的单个字符位于验证码图形左上角的 (codeX, codeY) 位置处
        private int codeX = 0;
        private int codeY = 0;
    
        //验证码由哪些字符组成
        char [] codeSequence = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz23456789".toCharArray();
    
        //初始化验证码图形属性
        public void init(){
            fontHeight = height - 2;
            codeX = width / (codeCount + 2);
            codeY = height - 4;
        }
    
        public void service(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //定义一个类型为 BufferedImage.TYPE_INT_BGR 类型的图像缓存
            BufferedImage buffImg = null;
            buffImg = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
    
            //在 buffImg 中创建一个 Graphics2D 图像
            Graphics2D graphics = null;
            graphics = buffImg.createGraphics();
    
            //设置一个颜色, 使 Graphics2D 对象的后续图形使用这个颜色
            graphics.setColor(Color.WHITE);
    
            //填充一个指定的矩形: x - 要填充矩形的 x 坐标; y - 要填充矩形的 y 坐标; width - 要填充矩形的宽度; height - 要填充矩形的高度
            graphics.fillRect(0, 0, width, height);
    
            //创建一个 Font 对象: name - 字体名称; style - Font 的样式常量; size - Font 的点大小
            Font font = null;
            font = new Font("", Font.BOLD, fontHeight);
            //使 Graphics2D 对象的后续图形使用此字体
            graphics.setFont(font);
    
            graphics.setColor(Color.BLACK);
    
            //绘制指定矩形的边框, 绘制出的矩形将比构件宽一个也高一个像素
            graphics.drawRect(0, 0, width - 1, height - 1);
    
            //随机产生 15 条干扰线, 使图像中的认证码不易被其它程序探测到
            Random random = null;
            random = new Random();
            graphics.setColor(Color.GREEN);
            for(int i = 0; i < 55; i++){
                int x = random.nextInt(width);
                int y = random.nextInt(height);
                int x1 = random.nextInt(20);
                int y1 = random.nextInt(20);
                graphics.drawLine(x, y, x + x1, y + y1);
            }
    
            //创建 randomCode 对象, 用于保存随机产生的验证码, 以便用户登录后进行验证
            StringBuffer randomCode;
            randomCode = new StringBuffer();
    
            for(int i = 0; i < codeCount; i++){
                //得到随机产生的验证码数字
                String strRand = null;
                strRand = String.valueOf(codeSequence[random.nextInt(36)]);
    
                //把正在产生的随机字符放入到 StringBuffer 中
                randomCode.append(strRand);
    
                //用随机产生的颜色将验证码绘制到图像中
                graphics.setColor(Color.BLUE);
                graphics.drawString(strRand, (i + 1)* codeX, codeY);
            }
    
            //再把存放有所有随机字符的 StringBuffer 对应的字符串放入到 HttpSession 中
            request.getSession().setAttribute(CHECK_CODE_KEY, randomCode.toString());
    
            //禁止图像缓存
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expires", 0);
    
            //将图像输出到输出流中
            ServletOutputStream sos = null;
            sos = response.getOutputStream();
            ImageIO.write(buffImg, "jpeg", sos); 
            sos.close();
        }
    }
    

    验证码正确的情况
    这里写图片描述
    这里写图片描述

    验证码输错的情况:
    这里写图片描述
    服务端控制台输出:
    sdfsdf
    JZUUFO

    验证码的流程是什么?
    浏览器访问http://localhost:8080/day01/check/index.jsp
    定义一个验证码输入框的getParameter
    checkCode:
    然后验证码图片

    <img alt="" src="<%= request.getContextPath() %>/validateColorServlet"> 

    访问ValidateColorServlet,在浏览器输出验证码图片
    在ValidateColorServlet中
    //再把存放有所有随机字符的 StringBuffer 对应的字符串放入到 HttpSession 中
    request.getSession().setAttribute(CHECK_CODE_KEY, randomCode.toString());

    通过Set-Cookie方式在Response Headers中返回
    当输入验证码完毕,点击提交,就跳转到CheckCodeServlet去验证
    String paramCode = request.getParameter(“CHECK_CODE_PARAM_NAME”)获取输入的验证码
    String sessionCode = (String)request.getSession().getAttribute(“CHECK_CODE_KEY”);获取Response Headers中返回的值

    然后2者一致说明验证成功!!
    错误的话request.getSession().setAttribute(“message”, “验证码不一致!”);
    重定向到index.jsp中进行页面输错提示

    展开全文
  • 看代码利用struts的同步令牌机制利用同步令牌(Token)机制来解决Web应用中重复提交的问题,Struts也给出了一个参考实现。基本原理:服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的...

    看代码

    利用struts的同步令牌机制

    利用同步令牌(Token)机制来解决Web应用中重复提交的问题,Struts也给出了一个参考实现。

    基本原理:

    服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。

    if (isTokenValid(request, true)) {

    // your code here

    return mapping.findForward("success");

    } else {

    saveToken(request);

    return mapping.findForward("submitagain");

    }

    Struts根据用户会话ID和当前系统时间来生成一个唯一(对于每个会话)令牌的,具体实现可以参考TokenProcessor类中的generateToken()方法。

    protected  boolean isTokenValid(javax.servlet.http.HttpServletRequest request)

    Return true if there is a transaction token stored in the user's current session, and the value submitted as a request parameter with this action matches it.

    protected  void saveToken(javax.servlet.http.HttpServletRequest request)

    Save a new transaction token in the user's current session, creating a new session if necessary.

    protected  void resetToken(javax.servlet.http.HttpServletRequest request)

    Reset the saved transaction token in the user's session.

    用org.apache.struts.action.Action类的以上3个方法来避免重复提交

    待提交页面前面的action使用saveToken方法,提交后的action检查isTokenValid,如果为true,即提交正确,使用resetToken清掉token。

    学习中!!!!!!!!

    展开全文
  • JavaScript 表单提交

    2020-05-02 22:59:20
    action 属性定义在提交表单时执行的动作。 向服务器提交表单的通常做法是使用提交按钮。 通常,表单会被提交到 web 服务器上的网页。 指定了某个服务器脚本来处理被提交表单: <form action="action_page.php">...
  • 今天我们利用AJAX来完成form表单提交众所周知,web运行的原理就是发送一次请求,对应一个页面,刷新整体,我们可以使用AJAX使页面局部刷新如果要让用户留在当前页面中,同时发出新的HTTP请求,就必须用JavaScript...
  • 场景描述:对于一个登录页面中有一个登录的表单,但是由于登录验证逻辑比较复杂,我们希望点击登录后不刷新当前页面,给出登录结果后再选择是跳到新的页面还是提示用户名密码错误。类似这样的问题很多很多。异步获取...
  • 这是需要通过switch_to_frame()方法将当前定位的主体切换为frame/iframe表单的内嵌页面中。 比如腾讯qq邮箱的用户信息提交模块就是嵌套处理的,如果想要输入用户名密码信息就要切换表单才可以 ''' 多表单:在一个...
  • 如果当前元素是表单表单内的元素,则将提交该元素。如果这导致当前页面发生更改,则此方法将阻塞,直到加载新页面为止。 Param Param Type Mandatory Description to TestObject Required ...
  • Web表单由输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据,是B端产品最重要的组成部分之一;本人结合自己的产品工作经验以及网上收集的资料,总结分析了大型B端业务中表单的设计方法,希望能...
  • form表单提交不跳转的方法

    热门讨论 2013-01-08 18:11:41
    在我们日常web端开发中,通常会遇到需要通过form表单提交而又不想让页面跳转的情况,如果使用struct2的情况下可以不返回,但是如果用的是spring的mvc这种方法就不起作用的。其实很简单,form表单里有个target属性,...
  •  a.)包含有FORM表单的页面必须通过一个服务器程序动态产生,服务器程序为每次产生的页面中的FORM表单都分配一个唯一的随机标识号,并在FORM表单的一个隐藏字段中设置这个标识号,同时在当前用户的Session域中保存...
  • web前端—列表和表单

    千次阅读 2016-12-22 21:43:08
    定义列表 咖啡 黑色热饮料 <dt></dt> <dd></dd> 无序列表 </ul><ol> <li><li> 表单表单提交地址" method="提交方法"> ...</form>action为空,向当前页面提交 get提交参数在地址栏可见,post不显示,
  • 提交表单数据太多了,你可以 1,更新到最新的系统补丁和.net补丁 2,可以在web.config里面写
  • 当页面中的表单提交字符串时,首先把字符串按照当前页面的编码,转化成字节串。然后再将每个字节转化成 "%XX" 的格式提交Web 服务器。比如,一个编码为 GB2312 的页面,提交 "中" 这个字符...
  • 设置表单提交的地址(默认提交当前页面) method 设置表单提交方式(默认是get方式)   c) method取值     aa) get:把数据拼接到地址栏后面,相对的不安全,只能提交量比较小的数据     bb) post:...
  • 但要使用此方式的时候,要以点击一个链接或者提交表单来实现。此方法有两个参数。 to:是第一个参数,是必须的,不可缺少。类型:字符串或者对象。 字符串: 绝对或相对URL地址。如:(“about/us.html”) 对象: ...
  • 要在 page 事件里面把validateRequest="false" 放在里面“当前页” 在Web.config/标签里面把 放在里面 切忌 有时标签里面有指令要注意
  • 做过web的应该都知道,当submit一个表单后,再按浏览器的刷新(F5),表单会再次提交,这样并不是我们想看到的。看了一下华佗的网站,他用的是token机制防重复提交(方法如下:进入页面之时,随机一个数值,可以是Math...
  • 当前大多数Web应用程序都是基于数据库驱动,这其中经常遇到的一个问题: 按F5键刷新造成的数据重复提交 曾经尝试过一些方法,最有效的是一篇发表在MSDN的方法, 原理如下:在ASP.NET页面中有一个名为__VIEWSTATE...
  • 首先通过jquery ajax提交表单服务器响应1.设置url // 设置当前urlvar list_url = '/document/order/default.php?page=' + page_nums + '&'+ $("#form1").serialize();var e_list_url = encodeURIComponen...
  • web利用redirect登录后返回之前的页面

    千次阅读 2018-02-19 20:54:27
    1.准备一个存在url的标签,和登陆的表单一起提交就行了 &lt;!--存放页面的url--&gt; &lt;input type="hidden" id="url" name="url" value=""&gt;...
  • SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能...
  • form表单

    2019-01-07 21:53:14
    action属性定义在提交表单时执行的动作。向服务器提交表单的通常做法是使用提交按钮。通常,表单会被提交到 web 服务器上的网页。如果省略 action 属性,则 action 会被设置为当前页面。 method属性规定在提交表单...
  • WEB页面上,通常SUBMIT类型的按钮会被默认指派为所在FORM表单提交按钮。 我们在做ASP.net WEB应用的时候,常常遇到会在同一个页面里添加多个按钮,而每个按钮肯定都会触发页面回送事件。 在ASP...
  • 默认情况下, 第一次访问一个 WEB 应用的一个 JSP 页面时, 该页面都必须有一个和这个请求相关联的 Session 对象. 因为 page 指定的 session 属性默认为 true 2). 若把 session 属性改为 false, JSP 页面不会要求...
  • 细说form表单

    2019-03-06 17:11:00
     浏览器是如何提交表单的?或者说浏览器在提交表单时需要做哪些事情?  浏览器并不是将所有的表单控件全部发送到服务器的,而是会查找所有的【成功控件】,只将这些成功控件的数据发送到服务端。(成功控件:每个...
  • 提交表单。突然出现了 如下错误。看了提示貌似和viewstate有关。但是页面没做什么处理啊。不应该的。故仔细看了看 “/WebXK”应用程序中的服务器错误。 此的状态信息无效,可能已损坏。 此的状态...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 254
精华内容 101
关键字:

web提交表单当前页