您好,登錄后才能下訂單哦!
使用struts2攔截器如何實現對用戶進行權限控制?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
大多數網站會設置用戶權限,如過濾非法用戶,用戶不登錄時不能進行訪問,或者設置訪問的權限,如部分內容僅對VIP開放等等,這些權限的控制都可以用struts2中的攔截器來實現。
下面通過一個簡單的Demo來模擬這種用戶權限控制的實現流程,設定三種不同身份的用戶,commen為普通用戶,VIP為會員用戶,還有一種admin為管理員。
先看一下Demo的整體結構:
首先搭建struts2框架的開發環境(前面博客中有介紹),環境搭建完之后又再看一看如何配置struts.xml:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="hello" extends="struts-default" namespace="/"> <interceptors> <interceptor name="testInterceptor" class="org.interceptor.InterceptorTest"></interceptor> <!-- 一個攔截器棧中可以定義多個攔截器 --> <interceptor-stack name="testStack"> <interceptor-ref name="testInterceptor" /> <interceptor-ref name="defaultStack" /> </interceptor-stack> </interceptors> <!--全局結果處理 --> <global-results> <result name="error">/Error.jsp</result> </global-results> <action name="login" class="org.interceptor.LoginAction"> <result>/WEB-INF/pages/index.jsp</result> </action> <action name="admin" class="org.interceptor.LoginAction" method="AdminExecute"> <interceptor-ref name="testStack"></interceptor-ref> <result>/WEB-INF/pages/admin.jsp</result> </action> <action name="vip" class="org.interceptor.LoginAction" method="vipExecute"> <interceptor-ref name="testStack"></interceptor-ref> <result>/WEB-INF/pages/vipUser.jsp</result> </action> <action name="commen" class="org.interceptor.LoginAction" method="commenExecute"> <interceptor-ref name="testStack"></interceptor-ref> <result>/WEB-INF/pages/commen.jsp</result> </action> </package> </struts>
其中,<global-results></global-results>是全局的result,有很多時候一個<result>可供很多<action>使用,這時可以使用<global-results>標簽來定義全局的<result>。執行順序:當一個Action返回的String沒有相應的<result>與之對應,Struts2就會查找全局的<result>,所以本次模擬測試中不符合條件被攔截的請求都會轉到error.jsp。
Action類,不做處理,全部放行,讓攔截器處理:
public class LoginAction implements SessionAware{ @SuppressWarnings("unused") private String username; private Map<String,Object> session; public void setUsername(String username) { this.username = username; session.put("username", username); } public void setSession(Map<String, Object> session) { // TODO Auto-generated method stub this.session = session; } public String AdminExecute(){ return "success"; } public String vipExecute(){ return "success"; } public String commenExecute(){ return "success"; } public String execute(){ return "success"; } }
Inteceptor(攔截器類):
public class LoginAction implements SessionAware{ @SuppressWarnings("unused") private String username; private Map<String,Object> session; public void setUsername(String username) { this.username = username; session.put("username", username); } public void setSession(Map<String, Object> session) { // TODO Auto-generated method stub this.session = session; } public String AdminExecute(){ return "success"; } public String vipExecute(){ return "success"; } public String commenExecute(){ return "success"; } public String execute(){ return "success"; } }
只是 模擬攔截器的實現思路,沒有持久層的數據,這里的方法是使用invocation.getProxy().getActionName()方法來獲取struts.xml中配置的action名稱,和用戶表單提交的名稱做對比,如果輸入的用戶名是以action名開頭的,就放行,否則攔截。
登錄jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% 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%>" rel="external nofollow" rel="external nofollow" > <title>login</title> </head> <body> <form action="login.action"> <input type="text" name="username"/> <input type="password" name="password"/> <input type="submit" value="login"> </form> </body> </html>
攔截后跳轉頁:
<body> <h5>你的權限不足,請先升級權限...</h5> </body>
訪問資源代碼:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% 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%>" rel="external nofollow" rel="external nofollow" > <title>index</title> </head> <body> <a href="admin.action" rel="external nofollow" >admin</a><br/> <a href="vip.action" rel="external nofollow" >vip</a><br/> <a href="commen.action" rel="external nofollow" >commen</a> </body> </html>
其余admin.jsp等界面沒有內容,只是為了區分實現跳轉頁面不同。
運行結果:
使用commen角色登錄:
點擊VIP以及admin跳轉鏈接時:
關于使用struts2攔截器如何實現對用戶進行權限控制問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。