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的過程。如果有不足之處,還望各位看官多多指出。 一、