控制器製作簡單驗證碼圖放到前端

@Controller
@RequestMapping("imageCode")
public class ImageCodeController {
    Color getRandColor(int fc, int bc) {//給定範圍獲得隨機顏色
        Random random = new Random();
        if (fc > 255)
            fc = 255;
        if (bc > 255)
            bc = 255;
        int r = fc + random.nextInt(bc - fc);
        int g = fc + random.nextInt(bc - fc);
        int b = fc + random.nextInt(bc - fc);
        return new Color(r, g, b);
    }

    @RequestMapping(value = "/showCode", method = RequestMethod.GET)
    public void outputImage(HttpServletRequest request, HttpServletResponse response, HttpSession session)
    {
        //設置頁面不緩存
        response.setHeader("Pragma", "No-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);

        // 在內存中創建圖象
        int width = 60, height = 20;
        BufferedImage image = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);

        // 獲取圖形上下文
        Graphics g = image.getGraphics();

        //生成隨機類
        Random random = new Random();

        // 設定背景色
        g.setColor(getRandColor(200, 250));
        g.fillRect(0, 0, width, height);

        //設定字體
        g.setFont(new Font("Times New Roman", Font.PLAIN, 18));

        //畫邊框
        //g.setColor(new Color());
        //g.drawRect(0,0,width-1,height-1);

        // 隨機產生155條幹擾線,使圖象中的認證碼不易被其它程序探測到
        g.setColor(getRandColor(160, 200));
        for (int i = 0; i < 100; i++) {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            int xl = random.nextInt(12);
            int yl = random.nextInt(12);
            g.drawLine(x, y, x + xl, y + yl);
        }

        // 取隨機產生的認證碼(4位數字)
        String sRand = "";
        for (int i = 0; i < 4; i++) {
            String rand = String.valueOf(random.nextInt(10));
            sRand += rand;
            // 將認證碼顯示到圖象中
            g.setColor(new Color(20 + random.nextInt(110), 20 + random
                    .nextInt(110), 20 + random.nextInt(110)));//調用函數出來的顏色相同,可能是因爲種子太接近,所以只能直接生成
            g.drawString(rand, 13 * i + 6, 16);
        }

        // 將認證碼存入SESSION
        session.setAttribute("code", sRand);
        // 圖象生效
        g.dispose();

        // 輸出圖象到頁面
        try {
            String formatName = "jpeg";
            ImageIO.write(image, /*"GIF"*/ formatName /* format desired */ , response.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    /*獲取驗證碼*/
    @RequestMapping(value = "/getCode", method = RequestMethod.POST)
    public Result getRandCode(HttpSession session)
    {
        Result result = new Result();
        Object obj= session.getAttribute("code");
        result.setObj(obj);
        return result ;
    }

}

前端頁面刷新 ,尾數帶上時間即可點擊刷新

這裏的驗證碼是把他放在session,登陸時取出session,其實最好放數據庫或redis之類的。

 

@Controller
public class LoginController extends BaseController {

    /**
     * 登錄
     *
     * @param username 用戶名
     * @param password 密碼
     * @param txtCode
     * @param session
     * @return
     */
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    @ResponseBody
    public Result loginPost(String username, String password, String txtCode, HttpSession session) {
        Result result = new Result();
        // 比對驗證碼是否正確
        if ( !(txtCode.equals(session.getAttribute("code") ) ) ) {
            result.setMsg("驗證碼錯誤");
            return result;
        }
        Subject user = SecurityUtils.getSubject();
        UsernamePasswordToken token =
                new UsernamePasswordToken(username, password);
        token.setRememberMe(true);
        try {
            user.login(token);
        } catch (UnknownAccountException e) {
            result.setMsg("賬號不存在");
            return result;
        } catch (DisabledAccountException e) {
            result.setMsg("賬號未啓用");
            return result;
        } catch (IncorrectCredentialsException e) {
            result.setMsg("密碼錯誤");
            return result;
        } catch (RuntimeException e) {
            e.printStackTrace();
            result.setMsg("未知錯誤,請刷新界面重新登錄!請聯繫管理員帶上報錯截圖"+e.getMessage());
//            result.setMsg(e.getMessage());
            return result;
        }
        result.setSuccess(true);
        session.setAttribute("sex" , getUserSex());
        return result;
    }

    /**
     * 退出
     *
     * @return
     */
    @RequestMapping("/logout")
//    @ResponseBody
    public String logout() {
        ShiroUtils.logout();
        return "redirect:/" ;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章