Browse Source

登录验证码

Luxnk 7 years ago
parent
commit
e77a4d4141

+ 38 - 0
src/xyz/luxnk/lproject/module/CaptchaModule.java

@@ -0,0 +1,38 @@
+package xyz.luxnk.lproject.module;
+
+import cn.apiclub.captcha.Captcha;
+import cn.apiclub.captcha.backgrounds.GradiatedBackgroundProducer;
+import cn.apiclub.captcha.gimpy.FishEyeGimpyRenderer;
+import org.nutz.ioc.loader.annotation.IocBean;
+import org.nutz.mvc.annotation.At;
+import org.nutz.mvc.annotation.Ok;
+import org.nutz.mvc.annotation.Param;
+import xyz.luxnk.lproject.util.Toolkit;
+
+import javax.servlet.http.HttpSession;
+import java.awt.image.BufferedImage;
+
+/**
+ * 验证码模块类
+ */
+@IocBean
+@At("/captcha")
+public class CaptchaModule {
+
+    @At
+    @Ok("raw:png")
+    public BufferedImage next(HttpSession session, @Param("w") int w, @Param("h") int h) {
+        if (w * h < 1) {    // 长或宽为0,重置为默认长宽
+            w = 200;
+            h = 60;
+        }
+        Captcha captcha = new Captcha.Builder(w, h)
+                                        .addText().addBackground(new GradiatedBackgroundProducer())
+                                        .gimp(new FishEyeGimpyRenderer())
+                                        .build();
+        String text = captcha.getAnswer();
+        session.setAttribute(Toolkit.captcha_attr, text);
+        return captcha.getImage();
+    }
+
+}

+ 9 - 3
src/xyz/luxnk/lproject/module/UserModule.java

@@ -10,10 +10,12 @@ import org.nutz.ioc.loader.annotation.Inject;
 import org.nutz.ioc.loader.annotation.IocBean;
 import org.nutz.lang.Strings;
 import org.nutz.lang.util.NutMap;
+import org.nutz.mvc.Scope;
 import org.nutz.mvc.annotation.*;
 import org.nutz.mvc.filter.CheckSession;
 import xyz.luxnk.lproject.bean.UserInfo;
 import xyz.luxnk.lproject.bean.UserProfile;
+import xyz.luxnk.lproject.util.Toolkit;
 
 import javax.servlet.http.HttpSession;
 import java.util.Date;
@@ -47,13 +49,17 @@ public class UserModule extends BaseModule {
      */
     @At
     @Filters()  // 覆盖UserModule类的@Filters设置,因为登录可不能要求是个已经登陆的Session
-    public Object login(@Param("username")String username, @Param("password")String password, HttpSession session) {
+    public Object login(@Param("username")String username, @Param("password")String password, @Param("captcha")String captcha, @Attr(scope = Scope.SESSION, value = "nutz_captcha")String _captcha, HttpSession session) {
+        NutMap re = new NutMap();
+        if (!Toolkit.checkCaptcha(_captcha, captcha)) {
+            return re.setv("ok", false).setv("msg", "验证码错误");
+        }
         UserInfo userInfo = dao.fetch(UserInfo.class, Cnd.where("username", "=", username).and("password", "=", password));
         if (userInfo == null) {
-            return false;
+            return re.setv("ok", false).setv("msg", "用户名或密码错误");
         } else {
             session.setAttribute("me", userInfo.getId());
-            return true;
+            return re.setv("ok", true);
         }
     }
 

BIN
web/WEB-INF/lib/simplecaptcha-1.2.2.jar


+ 9 - 3
web/index.jsp

@@ -11,6 +11,13 @@
       <form action="#" id="loginForm" method="post">
         用户名 <input name="username" type="text" value="admin" />
         密码 <input name="password" type="password" value="123456" />
+        验证码 <input name="captcha" type="text" value="" />
+        <img id="captcha_img" onclick="next_captcha(); return false;" src="${base}/captcha/next" />
+        <script>
+          function next_captcha() {
+              $('#captcha_img').attr('src', '${base}/captcha/next?_=' + new Date().getTime());
+          }
+        </script>
         <button type="button" id="login_button">提交</button>
       </form>
     </div>
@@ -36,12 +43,11 @@
                   },
                   dataType: 'json',
                   success: function (data) {
-                      alert(data);
-                      if (data == true) {
+                      if (data && data.ok) {
                           alert('登录成功');
                           location.reload();
                       } else {
-                          alert('登录失败,请检查账号密码');
+                          alert(data.msg);
                       }
                   }
               });