1. 程式人生 > >Springmvc整合Shiro實現許可權管理

Springmvc整合Shiro實現許可權管理

package com.authc.utils;

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

/**
 * 驗證碼生成器
 * @see --------------------------------------------------------------------------------------------------------------
 * @see 可生成數字、大寫、小寫字母及三者混合型別的驗證碼
 * @see 支援自定義驗證碼字元數量,支援自定義驗證碼圖片的大小,支援自定義需排除的特殊字元,支援自定義干擾線的數量,支援自定義驗證碼圖文顏色
 * @see --------------------------------------------------------------------------------------------------------------
 * @see 另外,給Shiro加入驗證碼有多種方式,也可以通過繼承修改FormAuthenticationFilter類,通過Shiro去驗證驗證碼
 * @see 而這裡既然使用了SpringMVC,也為了簡化操作,就使用此工具生成驗證碼,並在Controller中處理驗證碼的校驗
 * @see --------------------------------------------------------------------------------------------------------------
 * @create Sep 29, 2013 4:23:13 PM
 * @author 玄玉<http://blog.csdn.net/jadyer>
 */
public class VerifyCodeUtil {
/**
 * 驗證碼型別為僅數字,即0~9
 */
public static final int TYPE_NUM_ONLY = 0;

/**
 * 驗證碼型別為僅字母,即大小寫字母混合
 */
public static final int TYPE_LETTER_ONLY = 1;

/**
 * 驗證碼型別為數字和大小寫字母混合
 */
public static final int TYPE_ALL_MIXED = 2;

/**
 * 驗證碼型別為數字和大寫字母混合
 */
public static final int TYPE_NUM_UPPER = 3;

/**
 * 驗證碼型別為數字和小寫字母混合
 */
public static final int TYPE_NUM_LOWER = 4;

/**
 * 驗證碼型別為僅大寫字母
 */
public static final int TYPE_UPPER_ONLY = 5;

/**
 * 驗證碼型別為僅小寫字母
 */
public static final int TYPE_LOWER_ONLY = 6;

private VerifyCodeUtil(){}

/**
 * 生成隨機顏色
 */
private static Color generateRandomColor() {
Random random = new Random();
return new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255));
}


/**
 * 生成圖片驗證碼
 * @param type           驗證碼型別,參見本類的靜態屬性
 * @param length         驗證碼字元長度,要求大於0的整數
 * @param excludeString  需排除的特殊字元
 * @param width          圖片寬度(注意此寬度若過小,容易造成驗證碼文字顯示不全,如4個字元的文字可使用85到90的寬度)
 * @param height         圖片高度
 * @param interLine      圖片中干擾線的條數
 * @param randomLocation 每個字元的高低位置是否隨機
 * @param backColor      圖片顏色,若為null則表示採用隨機顏色
 * @param foreColor      字型顏色,若為null則表示採用隨機顏色
 * @param lineColor      干擾線顏色,若為null則表示採用隨機顏色
 * @return 圖片快取物件
 */
public static BufferedImage generateImageCode(int type, int length, String excludeString, int width, int height, int interLine, boolean randomLocation, Color backColor, Color foreColor, Color lineColor){
String textCode = generateTextCode(type, length, excludeString);
return generateImageCode(textCode, width, height, interLine, randomLocation, backColor, foreColor, lineColor);
}


/**
 * 生成驗證碼字串
 * @param type          驗證碼型別,參見本類的靜態屬性
 * @param length        驗證碼長度,要求大於0的整數
 * @param excludeString 需排除的特殊字元(無需排除則為null)
 * @return 驗證碼字串
 */
public static String generateTextCode(int type, int length, String excludeString){
if(length <= 0){
return "";
}
StringBuffer verifyCode = new StringBuffer();
int i = 0;
Random random = new Random();
switch(type){
case TYPE_NUM_ONLY:
while(i < length){
int t = random.nextInt(10);
//排除特殊字元
if(null==excludeString || excludeString.indexOf(t+"")<0) {
verifyCode.append(t);
i++;
}
}
break;
case TYPE_LETTER_ONLY:
while(i < length){
int t = random.nextInt(123);
if((t>=97 || (t>=65&&t<=90)) && (null==excludeString||excludeString.indexOf((char)t)<0)){
verifyCode.append((char)t);
i++;
}
}
break;
case TYPE_ALL_MIXED:
while(i < length){
int t = random.nextInt(123);
if((t>=97 || (t>=65&&t<=90) || (t>=48&&t<=57)) && (null==excludeString||excludeString.indexOf((char)t)<0)){
verifyCode.append((char)t);
i++;
}
}
break;
case TYPE_NUM_UPPER:
while(i < length){
int t = random.nextInt(91);
if((t>=65 || (t>=48&&t<=57)) && (null==excludeString || excludeString.indexOf((char)t)<0)){
verifyCode.append((char)t);
i++;
}
}
break;
case TYPE_NUM_LOWER:
while(i < length){
int t = random.nextInt(123);
if((t>=97 || (t>=48&&t<=57)) && (null==excludeString || excludeString.indexOf((char)t)<0)){
verifyCode.append((char)t);
i++;
}
}
break;
case TYPE_UPPER_ONLY:
while(i < length){
int t = random.nextInt(91);
if((t >= 65) && (null==excludeString||excludeString.indexOf((char)t)<0)){
verifyCode.append((char)t);
i++;
}
}
break;
case TYPE_LOWER_ONLY:
while(i < length){
int t = random.nextInt(123);
if((t>=97) && (null==excludeString||excludeString.indexOf((char)t)<0)){
verifyCode.append((char)t);
i++;
}
}
break;
}
return verifyCode.toString();
}

/**
 * 已有驗證碼,生成驗證碼圖片
 * @param textCode       文字驗證碼
 * @param width          圖片寬度(注意此寬度若過小,容易造成驗證碼文字顯示不全,如4個字元的文字可使用85到90的寬度)
 * @param height         圖片高度
 * @param interLine      圖片中干擾線的條數
 * @param randomLocation 每個字元的高低位置是否隨機
 * @param backColor      圖片顏色,若為null則表示採用隨機顏色
 * @param foreColor      字型顏色,若為null則表示採用隨機顏色
 * @param lineColor      干擾線顏色,若為null則表示採用隨機顏色
 * @return 圖片快取物件
 */
public static BufferedImage generateImageCode(String textCode, int width, int height, int interLine, boolean randomLocation, Color backColor, Color foreColor, Color lineColor){
//建立記憶體影象
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//獲取圖形上下文
Graphics graphics = bufferedImage.getGraphics();
//畫背景圖
graphics.setColor(null==backColor ? generateRandomColor() : backColor);
graphics.fillRect(0, 0, width, height);
//畫干擾線
Random random = new Random();
if(interLine > 0){
int x = 0, y = 0, x1 = width, y1 = 0;
for(int i=0; i<interLine; i++){
graphics.setColor(null==lineColor ? generateRandomColor() : lineColor);
y = random.nextInt(height);
y1 = random.nextInt(height);
graphics.drawLine(x, y, x1, y1);
}
}
//字型大小為圖片高度的80%
int fsize = (int)(height * 0.8);
int fx = height - fsize;
int fy = fsize;
//設定字型
graphics.setFont(new Font("Default", Font.PLAIN, fsize));
//寫驗證碼字元
for(int i=0; i<textCode.length(); i++){
fy = randomLocation ? (int)((Math.random()*0.3+0.6)*height) : fy;
graphics.setColor(null==foreColor ? generateRandomColor() : foreColor);
//將驗證碼字元顯示到圖象中
graphics.drawString(textCode.charAt(i)+"", fx, fy);
fx += fsize * 0.9;
}
graphics.dispose();
return bufferedImage;
}
}

9.login.jsp登入頁面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page isELIgnored="false"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
request.setAttribute("home", path);
%>
 <!DOCTYPE HTML>
<html lang="en-US"> 
<!-- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html> -->
<script type="text/javascript" src="<%=request.getContextPath()%>/res/login/prefixfree.min.js"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/res/js/jquery-1.11.3.min.js"></script>

<head>
<meta charset="UTF-8">
<title>使用者登入</title>
<link rel="stylesheet" href="<%=request.getContextPath()%>/res/login/login.css" type="text/css"></link>

<script type="text/javascript">
var home ="${home}";
var msg ="${login_msg }";
    
$(function(){  //生成驗證碼         
    $('#verifyCodeImage').click(function () {  
    $(this).hide().attr('src', '<%=path%>/member/getVerifyCodeImage?' + Math.floor(Math.random()*100) ).fadeIn(); });      
});   
 
window.onbeforeunload = function(){  
    //關閉視窗時自動退出  
    if(event.clientX>360&&event.clientY<0||event.altKey){     
        alert(parent.document.location);  
    }  
};  
             
function changeCode() {  //重新整理
    $('#verifyCodeImage').hide().attr('src', '<%=path%>/member/getVerifyCodeImage?' + Math.floor(Math.random()*100) ).fadeIn();  
    event.cancelBubble=true;  
} 

if(msg!="")
{
alert(msg);
}
</script>

</head>
<body>

   <div class="content">
           <form action="<%=request.getContextPath()%>/member/toLogin" method="post" class="login-form">
               <div class="username">
                   <input type="text" name="username" placeholder="
[email protected]
" autocomplete="on" /> <div id="loginMsg"></div> <span class="user-icon icon">u</span> </div> <div class="password"> <input type="password" name="password" placeholder="*******" /> <span class="password-icon icon">p</span> </div> <div class="code-div"> <input type="text" name="verifyCode" placeholder="請輸入驗證碼" /> <img id="verifyCodeImage" src="<%=request.getContextPath()%>/member/getVerifyCodeImage"/> <!-- <a href="javascript:void(0)" onclick="changeCode()">看不清?換一張</a> --> </div> <div class="account-control"> <input type="checkbox" name="rememberMe" id="Remember me" value="Remember me" checked="checked" /> <label for="Remember me" data-on="c" class="check"></label> <label for="Remember me" class="info">Remember me</label> <!-- <input type="hidden" name="rememberMe" value="true"> --> <button type="submit">Login</button> </div> <p class="not-registered">Not a registered user yet?<a>Sign up now!</a></p> </form> </div> </body> </html>

10.main.jsp主介面

相關推薦

Springmvc整合Shiro實現許可權管理

package com.authc.utils; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.util.Rand

Spring Boot 整合 Shiro實現許可權控制,親測可用,附帶sql

前提: 本文主要講解Spring Boot 與 Shiro的整合 與許可權控制的實現方式(主要以程式碼實現功能為主),主要用到的技術Spring Boot+Shiro+Jpa(通過Maven構建),並不會涉及到Shiro框架的原始碼分析 如果有想要學習Shiro框架的小夥伴可以去http://shiro.

springboot整合shiro 實現許可權控制

shiro apache shiro 是一個輕量級的身份驗證與授權框架,與spring security 相比較,簡單易用,靈活性高,springboot本身是提供了對security的支援,畢竟是自家的東西。springboot暫時沒有整合shiro,這得自

CAS+Shiro實現許可權管理

本次Demo直接使用 Shiro——實現許可權控制demo思路(包含自定義標籤hasAnyPermission)中的Shiro許可權管理的Demo,可點選連結前往檢視:https://blog.csdn.net/fancheng614/article/details/83718096 在使用

shiro實現許可權管理時遇到的坑

最近在一個專案中應用到了shiro框架實現許可權管理,也是一邊在網上查資料一邊實現,對shiro的細節的李姐可能不夠深入,所以都在專案中遇到了挺多麻煩。現在說一下我遇到的情況 //1. 把 AuthenticationToken 轉換為 UsernamePasswordTo

Shiro框架從入門到實戰程式碼(五)springMVC結合Shiro實現許可權驗證

LoginController @Controller public class LoginController { @RequestMapping("gologin.html") p

SpringBoot&Shiro實現許可權管理

SpringBoot&Shiro實現許可權管理 引言 相信大家前來看這篇文章的時候,是有SpringBoot和Shiro基礎的,所以本文只介紹整合的步驟,如果哪裡寫的不好,懇請大家能指出錯誤,謝謝!依賴以及一些配置檔案請在原始碼裡參考,請參見 https://github.com/Slags/spri

Shiro 整合SpringMVC 並且實現許可權管理,登入和登出

Apache Shiro是Java的一個安全框架。目前,使用Apache Shiro的人越來越多,因為它相當簡單,對比Spring Security,可能沒有Spring Security做的功能強大,但是在實際工作時可能並不需要那麼複雜的東西,所以使用小而簡單

springmvc整合shiro許可權控制

一、什麼是Shiro   Apache Shiro是一個強大易用的Java安全框架,提供了認證、授權、加密和會話管理等功能:  認證 - 使用者身份識別,常被稱為使用者“登入”; 授權 - 訪問控制; 密碼加密 - 保護或隱藏資料防止被偷窺; 會話

SpringMVC整合shiro許可權(附原始碼)

springMVC框架這裡就不多說了,下面是在springMVC框架上面直接整合shiro程式碼步驟 下面是我專案結構: 1、web.xml新增Shiro Filter <filter> <filter-nam

springMVC整合shiro與cas實現SSO單點登入

一、前言 Apache Shiro與Spring Security一樣是Java的一個安全框架。那為什麼與Spring整合卻用Shiro?其實我個人是認為Spring Security太過於笨重,要寫太多的過濾器,Shiro的配置簡單這就是我選擇的理由,何況Spring官方

整合springboot+mvc+mybatis(通用mapper)+druid+jsp+bootstrap實現許可權管理檔案上傳下載多資料來源切換操作日誌記錄等功能

花了兩週,學習了下springboot,然後做個小東西練練手.專案基於jdk1.8+maven整合了springboot+mvc+mybatis(通用mapper)+druid+jsp+bootstrap等技術,springboot+Listener(監聽器),Filter

Spring專案整合ShiroFilter簡單實現許可權管理

Shiros是我們開發中常用的用來實現許可權控制的一種工具包,它主要有認證、授權、加密、會話管理、與Web整合、快取等功能。我是從事javaweb工作的,我就經常遇到需要實現許可權控制的專案,之前我們都是靠查詢資料獲取列表拼接展示的,還有的是及時的判斷許可權的問

SpringBoot/SpringMVC整合Shiro實現登入與註冊(MD5加鹽加密)

本文轉載於:https://blog.csdn.net/Colton_Null/article/details/78992836 ----------------------------------超級囂張的分割線---------------------------------------

SpringBoot整合Shiro許可權的動態載入、更新,Shiro-Redis實現分散式Session共享

本文章是介紹SpringBoot整合Apache Shiro,並實現在專案啟動時從資料庫中讀取許可權列表,在對角色進行增刪改時,動態更新許可權以及在分散式環境下的Session共享,Session共享使用的是shiro-redis框架,是根據真實專案寫的一個Demo。網上有很

IDEA整合Maven工具使用shiro進行許可權管理

第一步:匯入jar包<!--shiro許可權控制器--> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core

Spring boot與shiro集合實現許可權管理

一.資料庫表設計 表中的測試資料: tb_user表如下, pass_word是根據通過如下程式碼生成,根據使用者名稱和密碼生成md5值: import org.apache.shiro.crypto.hash.SimpleHash; import org

Spring Boot 整合Shiro實現登陸認證和許可權控制

我在做畢設的時候,使用了Shiro作為專案中的登陸認證和許可權控制。 下面是我專案中如何實現整合shiro的學習記錄。 匯入shiro依賴包到pom.xml <!-- Shiro依賴 --> <dependency>

使用shiro攔截器鏈實現許可權管理

在開篇之前,先介紹一下shiro,那麼 什麼是shiro呢? Apache Shiro(發音為“shee-roh”,日語“堡壘(Castle)”的意思)是一個強大易用的Java安全框架,提供了認證、授權、加密和會話管理功能,可為任何應用提供安全保障 -

SpringMVC整合Shiro許可權框架

最近在學習Shiro,首先非常感謝開濤大神的《跟我學Shiro》系列,在我學習的過程中發揮了很大的指導作用。學習一個新的東西首先就是做一個demo,多看不如多敲,只有在實踐中才能發現自己的欠缺,下面記錄下來我整合shiro的過程。如果有不足之處,還望各位看官多多指出。 一、