久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

SpringMVC+Apache Shiro+JPA(hibernate)案例教學(xué)(三)給Shiro登錄驗(yàn)證加上驗(yàn)證碼

 wayne_liberary 2014-08-07

序:

給Shiro加入驗(yàn)證碼,有多種方式,,當(dāng)然你也可以通過(guò)繼承修改FormAuthenticationFilter類,通過(guò)Shiro去驗(yàn)證驗(yàn)證碼,。
具體實(shí)現(xiàn)請(qǐng)百度: 

應(yīng)用Shiro到Web Application(驗(yàn)證碼實(shí)現(xiàn))

而今天我要說(shuō)的,,既然使用的SpringMVC,為什么不直接在Controller中就處理驗(yàn)證碼驗(yàn)證,,讓事情變的更簡(jiǎn)單一點(diǎn)呢,?


一、新建ValidateCode.java驗(yàn)證碼工具類 

復(fù)制代碼
package org.shiro.demo.util;

import java.util.Random;
import java.awt.image.BufferedImage;
import java.awt.Graphics;
import java.awt.Font;
import java.awt.Color;

/**
 * 驗(yàn)證碼生成器類,,可生成數(shù)字,、大寫、小寫字母及三者混合類型的驗(yàn)證碼,。 支持自定義驗(yàn)證碼字符數(shù)量,; 支持自定義驗(yàn)證碼圖片的大小,; 支持自定義需排除的特殊字符,;
 * 支持自定義干擾線的數(shù)量; 支持自定義驗(yàn)證碼圖文顏色
 */
public class ValidateCode {

    /**
     * 驗(yàn)證碼類型為僅數(shù)字 0~9
     */
    public static final int TYPE_NUM_ONLY = 0;

    /**
     * 驗(yàn)證碼類型為僅字母,,即大寫,、小寫字母混合
     */
    public static final int TYPE_LETTER_ONLY = 1;

    /**
     * 驗(yàn)證碼類型為數(shù)字、大寫字母,、小寫字母混合
     */
    public static final int TYPE_ALL_MIXED = 2;

    /**
     * 驗(yàn)證碼類型為數(shù)字,、大寫字母混合
     */
    public static final int TYPE_NUM_UPPER = 3;

    /**
     * 驗(yàn)證碼類型為數(shù)字、小寫字母混合
     */
    public static final int TYPE_NUM_LOWER = 4;

    /**
     * 驗(yàn)證碼類型為僅大寫字母
     */
    public static final int TYPE_UPPER_ONLY = 5;

    /**
     * 驗(yàn)證碼類型為僅小寫字母
     */
    public static final int TYPE_LOWER_ONLY = 6;

    private ValidateCode() {
        
    }

    /**
     * 生成驗(yàn)證碼字符串
     * 
     * @param type
     *            驗(yàn)證碼類型,參見本類的靜態(tài)屬性
     * @param length
     *            驗(yàn)證碼長(zhǎng)度,,大于0的整數(shù)
     * @param exChars
     *            需排除的特殊字符(僅對(duì)數(shù)字,、字母混合型驗(yàn)證碼有效,無(wú)需排除則為null)
     * @return 驗(yàn)證碼字符串
     */
    public static String generateTextCode(int type, int length, String exChars) {

        if (length <= 0)
            return "";

        StringBuffer code = new StringBuffer();
        int i = 0;
        Random r = new Random();

        switch (type) {

        // 僅數(shù)字
        case TYPE_NUM_ONLY:
            while (i < length) {
                int t = r.nextInt(10);
                if (exChars == null || exChars.indexOf(t + "") < 0) {// 排除特殊字符
                    code.append(t);
                    i++;
                }
            }
            break;

        // 僅字母(即大寫字母,、小寫字母混合)
        case TYPE_LETTER_ONLY:
            while (i < length) {
                int t = r.nextInt(123);
                if ((t >= 97 || (t >= 65 && t <= 90)) && (exChars == null || exChars.indexOf((char) t) < 0)) {
                    code.append((char) t);
                    i++;
                }
            }
            break;

        // 數(shù)字,、大寫字母、小寫字母混合
        case TYPE_ALL_MIXED:
            while (i < length) {
                int t = r.nextInt(123);
                if ((t >= 97 || (t >= 65 && t <= 90) || (t >= 48 && t <= 57))
                        && (exChars == null || exChars.indexOf((char) t) < 0)) {
                    code.append((char) t);
                    i++;
                }
            }
            break;

        // 數(shù)字,、大寫字母混合
        case TYPE_NUM_UPPER:
            while (i < length) {
                int t = r.nextInt(91);
                if ((t >= 65 || (t >= 48 && t <= 57)) && (exChars == null || exChars.indexOf((char) t) < 0)) {
                    code.append((char) t);
                    i++;
                }
            }
            break;

        // 數(shù)字,、小寫字母混合
        case TYPE_NUM_LOWER:
            while (i < length) {
                int t = r.nextInt(123);
                if ((t >= 97 || (t >= 48 && t <= 57)) && (exChars == null || exChars.indexOf((char) t) < 0)) {
                    code.append((char) t);
                    i++;
                }
            }
            break;

        // 僅大寫字母
        case TYPE_UPPER_ONLY:
            while (i < length) {
                int t = r.nextInt(91);
                if ((t >= 65) && (exChars == null || exChars.indexOf((char) t) < 0)) {
                    code.append((char) t);
                    i++;
                }
            }
            break;

        // 僅小寫字母
        case TYPE_LOWER_ONLY:
            while (i < length) {
                int t = r.nextInt(123);
                if ((t >= 97) && (exChars == null || exChars.indexOf((char) t) < 0)) {
                    code.append((char) t);
                    i++;
                }
            }
            break;

        }

        return code.toString();
    }

    /**
     * 已有驗(yàn)證碼,生成驗(yàn)證碼圖片
     * 
     * @param textCode
     *            文本驗(yàn)證碼
     * @param width
     *            圖片寬度
     * @param height
     *            圖片高度
     * @param interLine
     *            圖片中干擾線的條數(shù)
     * @param randomLocation
     *            每個(gè)字符的高低位置是否隨機(jī)
     * @param backColor
     *            圖片顏色,,若為null,,則采用隨機(jī)顏色
     * @param foreColor
     *            字體顏色,若為null,,則采用隨機(jī)顏色
     * @param lineColor
     *            干擾線顏色,,若為null,則采用隨機(jī)顏色
     * @return 圖片緩存對(duì)象
     */
    public static BufferedImage generateImageCode(String textCode, int width, int height, int interLine,
            boolean randomLocation, Color backColor, Color foreColor, Color lineColor) {

        BufferedImage bim = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics g = bim.getGraphics();

        // 畫背景圖
        g.setColor(backColor == null ? getRandomColor() : backColor);
        g.fillRect(0, 0, width, height);

        // 畫干擾線
        Random r = new Random();
        if (interLine > 0) {

            int x = 0, y = 0, x1 = width, y1 = 0;
            for (int i = 0; i < interLine; i++) {
                g.setColor(lineColor == null ? getRandomColor() : lineColor);
                y = r.nextInt(height);
                y1 = r.nextInt(height);

                g.drawLine(x, y, x1, y1);
            }
        }

        // 寫驗(yàn)證碼

        // g.setColor(getRandomColor());
        // g.setColor(isSimpleColor?Color.BLACK:Color.WHITE);

        // 字體大小為圖片高度的80%
        int fsize = (int) (height * 0.8);
        int fx = height - fsize;
        int fy = fsize;

        g.setFont(new Font("Default", Font.PLAIN, fsize));

        // 寫驗(yàn)證碼字符
        for (int i = 0; i < textCode.length(); i++) {
            fy = randomLocation ? (int) ((Math.random() * 0.3 + 0.6) * height) : fy;// 每個(gè)字符高低是否隨機(jī)
            g.setColor(foreColor == null ? getRandomColor() : foreColor);
            g.drawString(textCode.charAt(i) + "", fx, fy);
            fx += fsize * 0.9;
        }

        g.dispose();

        return bim;
    }

    /**
     * 生成圖片驗(yàn)證碼
     * 
     * @param type
     *            驗(yàn)證碼類型,,參見本類的靜態(tài)屬性
     * @param length
     *            驗(yàn)證碼字符長(zhǎng)度,,大于0的整數(shù)
     * @param exChars
     *            需排除的特殊字符
     * @param width
     *            圖片寬度
     * @param height
     *            圖片高度
     * @param interLine
     *            圖片中干擾線的條數(shù)
     * @param randomLocation
     *            每個(gè)字符的高低位置是否隨機(jī)
     * @param backColor
     *            圖片顏色,若為null,,則采用隨機(jī)顏色
     * @param foreColor
     *            字體顏色,,若為null,則采用隨機(jī)顏色
     * @param lineColor
     *            干擾線顏色,,若為null,,則采用隨機(jī)顏色
     * @return 圖片緩存對(duì)象
     */
    public static BufferedImage generateImageCode(int type, int length, String exChars, int width, int height,
            int interLine, boolean randomLocation, Color backColor, Color foreColor, Color lineColor) {

        String textCode = generateTextCode(type, length, exChars);
        BufferedImage bim = generateImageCode(textCode, width, height, interLine, randomLocation, backColor, foreColor,
                lineColor);

        return bim;
    }

    /**
     * 產(chǎn)生隨機(jī)顏色
     * 
     * @return
     */
    private static Color getRandomColor() {
        Random r = new Random();
        Color c = new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255));
        return c;
    }

}
復(fù)制代碼

 

 二,、修改UserController.java的實(shí)現(xiàn) 

復(fù)制代碼
package org.shiro.demo.controller;

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.util.WebUtils;
import org.shiro.demo.entity.User;
import org.shiro.demo.util.ValidateCode;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class LoginController {
    
    @RequestMapping(value = "/login" ,method=RequestMethod.POST,produces={"application/json;charset=UTF-8"})
    public String login(User currUser,HttpSession session, HttpServletRequest request){
        String code = (String) session.getAttribute("validateCode");
        String submitCode = WebUtils.getCleanParam(request, "validateCode");
        if (StringUtils.isEmpty(submitCode) || !StringUtils.equals(code,submitCode.toLowerCase())) {
            return "redirect:/";
        }
        Subject user = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(currUser.getAccount(),currUser.getPassword());
        token.setRememberMe(true);
        try {
            user.login(token);
            return "/system/main";
        }catch (AuthenticationException e) {
            token.clear();
            return "redirect:/";
        }
    }

    /**
     * 生成驗(yàn)證碼
     * @param request
     * @param response
     * @throws IOException
     */
    @RequestMapping(value = "/validateCode")
    public void validateCode(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setHeader("Cache-Control", "no-cache");
        String verifyCode = ValidateCode.generateTextCode(ValidateCode.TYPE_NUM_ONLY, 4, null);
        request.getSession().setAttribute("validateCode", verifyCode);
        response.setContentType("image/jpeg");
        BufferedImage bim = ValidateCode.generateImageCode(verifyCode, 90, 30, 3, true, Color.WHITE, Color.BLACK, null);
        ImageIO.write(bim, "JPEG", response.getOutputStream());
    }
}
復(fù)制代碼

 

 三,、修改login.jsp

復(fù)制代碼
<%@ page language="java" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java./jsp/jstl/core" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path;
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>shirodemo login page</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <script type="text/javascript" src='<c:url value="/resources/js/jquery-1.6.3.min.js"/>'></script>
    <script type="text/javascript">
    <!--
    function reloadValidateCode(){
        $("#validateCodeImg").attr("src","<%=basePath%>/validateCode?data=" + new Date() + Math.floor(Math.random()*24));
    }
    //-->
    </script>
  </head>
  
  <body>
    <form action="<%=basePath%>/login" method="post">
    <ul>
        <li>姓 名:<input type="text" name="account" /> </li>
        <li>密 碼:<input type="text" name="password" /> </li>
        <li>驗(yàn)證碼:<input type="text" name="validateCode" />  <img id="validateCodeImg" src="<%=basePath%>/validateCode" />  <a href="#" onclick="javascript:reloadValidateCode();">看不清?</a></li>
        <li><input type="submit" value="確認(rèn)" /> </li>
    </ul>
    </form>
  </body>
</html>
復(fù)制代碼

 

至此,,就給你的登陸頁(yè)面加上驗(yàn)證碼了,。訪問(wèn)你的login.jsp試試?

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多