登录注销购物车验证码

登录和注销

LoginServlet:

接收请求参数,username、password

调用业务方法处理请求:dao.checkLogin(username, password);

控制页面跳转:失败,回到登录页面;成功:跳转到指定页面,并将用户信息共享到Session中

UserDAOImpl:

  1. SELECT * FROM t_user WHERE username = ? AND password = ?;(提示:账号或密码输入有误)
  2. SELECT * FROM t_user WHERE username = ?;然后再在内存中校验密码(提示:账号不存在/密码错误)

基于Session的购物车案例

购物车的实现:

1.页面,实际上就是一个商品列表
2.用户选择商品,加入购物车,实际上就是在将商品放在内存的一个集合中,然后在将集合放在Session中
3.在页面中的数据是从session中取出,然后循环遍历

上面是商城中的购物车的一种实现方式:

问题:Sessio.是在关闭浏览器的时候销毁(浏览器中的jsessionid没了),购物车空了~~~

解决方案:
        Cookie+数据库
        1.在用户登陆之前,将数据保存在Cookie中
        2.将Cookie中保存的数据保存到数据库中

今天,使用Session去感受购物车的实现的原理

购物车的设计:

 1.商品对象(名称/价格/数量等):CartItem
 2.购物车对象:List<CartItem>

验证码

验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。

使用UUID生成随机数,将随机数保存到Session中

验证验证码是否正确:

  1. 获取到用户输入的验证码
  2. 获取到Session中保存的验证码
  3. 比较两份验证码是否正确

浏览器的缓存(解决服务器的压力):在浏览器中,通常会将get方式的请求的结果缓存起来,在每次发送get方式请求的时候,先到缓存中去找有没有对应的请求,如果有,结直接使用缓存中的结果数据,就不会再发送请求去服务器查询数据

解决方案:欺骗浏览器

  在请求路径后加上一些随机数;new Date().getTime();
  /randomCode?+new Date().getTime();

防止表单重复提交

没有完整的进行一次请求页面->提交页面的过程而完成数据提交
造成重复提交的原因:
由于服务器缓慢或网络延迟的原因,重复点击提交按钮
已经提交成功,刷新成功页面(forward)
已经提交成功,通过回退,再次点击提交按钮

注意:
回退后,刷新表单页面,再次提交这时不是重复提交,而是发送新的请求
在Firefox下,重复提交到同一地址无效

解决方案:

     使用令牌机制:在第一次请求表单页面的时候,生成一份随机数
     <%  
                String code= UUID.randomUUID().toString() ;
                session.setAttribute(“code”, code)
      %>
      1.存放到表单中
             <input type=”hidden” name=”code” value=”${code}”/>
      2.存放到Session中
            session.setAttribute(“code”, code)

     验证是否是一次正确的请求
     获取到两份数据,判断是否相等
            相等:将Session中的数据销毁
            不等:什么都不做

项目源码:login-logout-randomCode-shoppingCart.zip