java学习笔记——javaweb之验证码 - Go语言中文社区

java学习笔记——javaweb之验证码


表单重复提交

当我们注册完用户后,跳转去注册成功页面。我们按下F5 刷新页面。这时候页面会提示我们是不是要重复提交表单。这个时候,如果我们点击【继续】。表单又会重新请求一次。这样我们的网站的健壮性就不够好。

 

 

 

表单重复提交有三个原因:

  1. 表单提交成功后,刷新页面
  2. 提交表单的时候网络比较慢(服务器sleep(3000)模拟),提不过去。所以多点几次提交。发了多次的请求。
  3. 用户提交完成之后,回退浏览器到上一个页面,然后再次提交。

 

 

解决方案一:使用重定向

            response.sendRedirect();  使用重定向跳转。(仅仅可以解决问题1)

 

解决方案二:推荐使用token防止表单重复提交 (可以解决所有问题)

token的使用需要分两步:

第一步:在表单页面端使用代码生成一个验证码存放到Session对象中

<body>

    <h1>用户注册</h1>

    <table>

        <form action="userServlet" method="post">

            <tr>

                <td>用户名:</td>

                <td><input type="text" name="username" /></td>

            </tr>

            <tr>

                <td>验证码:</td>

                <td><input type="text" name="code" /><img alt="" width="100" height="30" src="kaptchaServlet"></td>

            </tr>

            <tr>

                <td colspan="2"><input type="submit" value="注册"/></td>

            </tr>

        </form>

    </table>

</body>

 

 

第二步:在Servlet中,获取Session中的token数据做对比。如果相同就执行业务操作。然后移除token数据。

    protected void doPost(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        response.setContentType("text/html; charset=UTF-8");

        //1.先获取请求参数---封装成为user对象

        String username = request.getParameter("username");

        String code = request.getParameter("code");

        System.out.println("客户端传递过来的验证码:" + code);

        String token = (String) request.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);

        System.out.println("Session中的验证码是:" + token);

        //从Session中删除验证码

        request.getSession().removeAttribute(Constants.KAPTCHA_SESSION_KEY);

        if (token != null && token.equalsIgnoreCase(code)) {

            //2.然后把user对象保存到数据库

            System.out.println("把[" + username + "] 插入数据库!");

            //3.转发到注册成功页面。

//          request.getRequestDispatcher("/registOK.jsp").forward(request, response);

            response.sendRedirect(request.getContextPath() + "/registOK.jsp");

        } else {

            response.getWriter().write("请不要重复提交表单!");

        }

    }

 

图片验证码

验证码,其实和我们前面讲的token是一样的。可以有效的防止用户恶意的提交数据。

那么验证码我们使用的是谷歌的kaptcha 这个验证码。

 

1、谷歌kaptcha验证码的使用步骤:

第一步:添加kaptcha的类库。到WEB-INF/lib/目录下

第二步:在web.xml中配置kaptcha类库中用于生成验证码的Servlet程序和访问地址     

第三步:在页面中使用<img>标签的src属性引入访问路径。(验证码前端验证需要结合Ajax使用。)

第四步:在接收的Servlet程序中通过Session获取验证码对比

 

 

 

第一步:添加kaptcha的类库。到WEB-INF/lib/目录下

 

第二步:在web.xml中配置kaptcha类库中用于生成验证码的Servlet程序和访问地址

    <!-- 配置生成图片的Servlet -->

    <servlet>

        <servlet-name>Kaptcha</servlet-name>

        <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>

        <init-param>

            <!-- 记住,kaptcha默认是英文验证码,不需要配置,如果改成中文验证码的时候,一定要加上中文字体配置。否则会有乱码  -->

            <param-name>kaptcha.textproducer.font.names</param-name>

            <param-value>楷体</param-value>

        </init-param>

    </servlet>

    <!-- 配置访问路径 -->

    <servlet-mapping>

        <servlet-name>Kaptcha</servlet-name>

        <url-pattern>/kaptchaServlet</url-pattern>

    </servlet-mapping>

 

第三步:在页面中使用<img>标签的src属性引入访问路径。(验证码前端验证需要结合Ajax使用。)

<!--  使用img标签引入验证码。也可以使用width和height属性控制验证码的大小  -->

<img alt="验证码找不到" src="kaptcha.jpg" width="80" height="25" />

 

第四步:在接收的Servlet程序中,使用如下代码获取验证码

        // 获取之前生成的验证码

        String code = (String) request.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);

        // 移除生成的验证码

        request.getSession().removeAttribute(Constants.KAPTCHA_SESSION_KEY);

 

 参数说明:

 

根据以上配置来看   想要使用中文中文验证码比较麻烦,可以使用自定义修改过的mykaptcha-2.3.2.jar;

方法如下:

1.使用中文验证码,加入

2.在配置com.google.code.kaptcha.servlet.KaptchaServlet程序到web.xml配置文件中(帮我们生成图片验证码)

3.拷贝笔记中的words.txt文件到src目录

4.配置启用中文验证码

 

    <servlet>

        <servlet-name>KaptchaServlet</servlet-name>

        <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>

        <init-param>

            <param-name>myWorlds</param-name>

            <param-value>true</param-value>

        </init-param>

        <init-param>

            <param-name>kaptcha.textproducer.font.names</param-name>

            <param-value>楷体</param-value>

        </init-param>

        <init-param>

            <param-name>myStyle</param-name>

            <param-value>true</param-value>

        </init-param>

    </servlet>

    <servlet-mapping>

        <servlet-name>KaptchaServlet</servlet-name>

        <url-pattern>/kaptchaServlet</url-pattern>

    </servlet-mapping>

 

 相关资源下载地址:https://download.csdn.net/download/qq_25106373/10568856

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_25106373/article/details/81254357
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-02-13 13:52:04
  • 阅读 ( 1005 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢