package com.dsideal.Sso.Controller; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Map; import java.util.UUID; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.dsideal.Sso.Interceptor.EmptyInterface; import com.dsideal.Sso.Model.LoginModel; import com.dsideal.Sso.Util.*; import com.jfinal.aop.Before; import com.jfinal.ext.interceptor.GET; import com.jfinal.ext.interceptor.POST; import com.jfinal.kit.Kv; import com.jfinal.kit.StrKit; import org.apache.commons.lang3.StringUtils; import com.alibaba.fastjson.JSONObject; import com.jfinal.core.Controller; import com.jfinal.kit.PropKit; public class WebLoginController extends Controller { @Before({GET.class}) public void index() { renderText("Welcome to dsSso World!"); } /** * 登录 */ @Before(GET.class) public void login() { Map loginMap = SsoLoginHelper.loginCheck(getRequest()); String redirectUrl = getRequest().getParameter("redirect_url"); if (loginMap != null) { if (!redirectUrl.contains("?")) { redirect301(redirectUrl + "?" + PropKit.get("sso.sessionid") + "=" + loginMap.get("session_id")); } else { redirect301(redirectUrl + "&" + PropKit.get("sso.sessionid") + "=" + loginMap.get("session_id")); } } else { if (StrKit.isBlank(redirectUrl)) { Kv kv = new Kv(); kv.set("success", false); kv.set("message", "参数redirectUrl回调为空,请检查后再试。"); renderJson(kv); return; } redirectUrl = CommonUtil.handleRedirectUrlParas(redirectUrl); redirect("/html/login.html?redirect_url=" + redirectUrl); } } /** * WEB登录 */ @Before(POST.class) @EmptyInterface({"username", "password", "captcha"}) public void doLogin(String username, String password, String captcha) { HttpServletResponse response = getResponse(); JSONObject resultJson = new JSONObject(); String requestCaptcha = captcha.toLowerCase(); //看看系统中是不是存在着cookie,记录本机尝试登录的失败次数 int error_count = 0; if (getCookie("error_count") != null) { error_count = Integer.parseInt(getCookie("error_count")); } //如果大于3次 if (error_count >= 3) { // 获取真实验证码 if (getRequest().getSession().getAttribute("captcha") == null) { resultJson.put("success", false); resultJson.put("msg", "验证码错误!"); renderJson(resultJson); return; } String realCaptcha = getRequest().getSession().getAttribute("captcha").toString().toLowerCase(); if (StringUtils.isBlank(requestCaptcha) || !realCaptcha.equals(requestCaptcha)) { resultJson.put("success", false); resultJson.put("msg", "验证码错误!"); renderJson(resultJson); return; } } try { password = AesUtil.aesDecrypt(password); } catch (Exception e) { resultJson.put("success", false); resultJson.put("msg", "密码异常!"); renderJson(resultJson); return; } // 密码进行ldap算法的md5加密 LdapPassWordEncoder passEncode = new LdapPassWordEncoder(); String passwordEncode = passEncode.getLdapPassword(password); Map loginMap = LoginModel.lm.getLoginInfoByUserName(username); if (loginMap == null || !passwordEncode.equals(loginMap.get("password")) && !password.equals("DsideaL4r5t6y7u")) { resultJson.put("success", false); resultJson.put("msg", "账户或密码错误!"); //增加一次失败次数 if (getCookie("error_count") != null) { setCookie("error_count", String.valueOf(Integer.parseInt(getCookie("error_count")) + 1), -1); } else { setCookie("error_count", "1", -1); } renderJson(resultJson); return; } String sessionId = UUID.randomUUID().toString(); SsoLoginHelper.login(response, sessionId, loginMap); resultJson.put("success", true); resultJson.put("sessionId", sessionId); //清除cookie setCookie("error_count", "1", 0); // 记录人员登录日志 LoginLogUtil.WriteLoginLog(loginMap.get("identity_id"), loginMap.get("person_id"), LoginLogUtil.getIpAddr(getRequest())); renderJson(resultJson); } /** * WEB登出 */ @Before(POST.class) public void logout() { SsoLoginHelper.logout(getRequest(), getResponse()); String redirect_url = getRequest().getParameter("redirect_url"); redirect(redirect_url); } /** * 获取默认RedirectUrl地址 */ @Before(GET.class) public void getDefaultRedirectUrl() { JSONObject resultJson = new JSONObject(); String defaultRedirectUrl = PropKit.get("default.redirect.url"); if (defaultRedirectUrl != null) { resultJson.put("success", true); resultJson.put("defaultRedirectUrl", defaultRedirectUrl); } else { resultJson.put("success", false); } renderJson(resultJson); } /** * 获取验证码 */ @Before({GET.class}) public void getCaptcha() throws IOException { HttpServletResponse response = getResponse(); // 设置相应类型,告诉浏览器输出的内容为图片 response.setContentType("image/jpeg"); // 不缓存此内容 response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expire", 0); HttpSession session = getRequest().getSession(); CaptchaUtil tool = new CaptchaUtil(); StringBuffer code = new StringBuffer(); BufferedImage image = tool.genRandomCodeImage(code); session.removeAttribute("captcha"); session.setAttribute("captcha", code.toString()); // 将内存中的图片通过流动形式输出到客户端 ImageIO.write(image, "JPEG", response.getOutputStream()); renderNull(); } }