1. 程式人生 > >struts2如何使用攔截器進行使用者許可權控制

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(攔截器類):
package org.interceptor;

import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class InterceptorTest extends AbstractInterceptor{
	private static final long serialVersionUID = 2422100326160658352L;

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		// TODO Auto-generated method stub
		//獲取了使用者所要訪問的路徑,即在struts.xml中設定的action的name
		String url = invocation.getProxy().getActionName();
		HttpSession session = ServletActionContext.getRequest().getSession();
		//獲取使用者輸入的使用者名稱
		String username = (String) session.getAttribute("username");
		System.out.println(username);
		if(username.startsWith(url)){
			return invocation.invoke();
		}else{
			return "error";
		}
		
	}

}
只是 模擬攔截器的實現思路,沒有持久層的資料,這裡的方法是使用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%>">   
    <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>
   <h4>你的許可權不足,請先升級許可權...</h4>
 </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%>">
    <title>index</title>
  </head>
  
  <body>
    <a href="admin.action">admin</a><br/>
    <a href="vip.action">vip</a><br/>
    <a href="commen.action">commen</a>
  </body>
</html>

其餘admin.jsp等介面沒有內容,只是為了區分實現跳轉頁面不同。

執行結果:

使用commen角色登入:

點選VIP以及admin跳轉連結時:


當點選commen連結時成功跳轉,這樣就實現了使用者許可權的控制。

相關推薦

struts2如何使用攔截進行使用者許可權控制

大多數網站會設定使用者許可權,如過濾非法使用者,使用者不登入時不能進行訪問,或者設定訪問的許可權,如部分內容僅對VIP開放等等,這些許可權的控制都可以用struts2中的攔截器來實現。下面通過一個簡單的Demo來模擬這種使用者許可權控制的實現流程,設定三種不同身份的使用者,

用struts的攔截實現使用者許可權控制

 步驟1、匯入struts2的庫。   步驟2、編寫Interceptor類。 package com.voicesoft.Interceptor; import com.opensymphony.xwork2.Action; import com.opensymphon

Struts2階】Struts2攔截實現基於Url的許可權管理

Struts2的攔截器只能攔截Action,攔截器是AOP的一種實現方式,可以使我們的系統架構更鬆散(耦合度低),可以插拔,容易互換,程式碼不改變的情況下很容易滿足客戶需求。 專案的許可權管理模組就使

Struts2 攔截控制jsp頁面跳轉

源自一個題目: 請編寫一個攔截器,該攔截器可以獲得使用者輸入的使用者名稱這個資料,業務邏輯為逐個判斷使用者名稱中是否包含“你”,“我”,“他”三個資料,如果包含則直接返回輸入頁面,如果不包含則執行至PersonAction。(除程式碼外,要給出攔截器和Action的配置檔案

struts2 攔截

struts2 攔截器攔截器,作用是在執行方法執行,進行過濾攔截。struts2 攔截器的幾種方式聲明攔截器,然後在Action中引用聲明的攔截器默認攔截器,在當前package下有且只能有一個默認攔截器作用:在當前package下所有的action都會經過默認攔截器攔截,當action中引入攔截器時,默認攔

j2ee之struts2攔截()

xtend 導入 ati cat imp color row 針對 所有 struts2的基本配置以及jar包的導入就不說了只寫關鍵部分: <struts> <package name="userPackage" extends="struts-

Struts2攔截

apach style tro cells 引入 span type can getc 一、內容提要 1.攔截器的概念及應用 2.STRUTS2自帶的攔截器 3.自定義攔截器 4.自定義攔截器的應用 二、攔截器的概念及應用 攔截器(Interceptor)是Struts

深入分析JavaWeb Item47 -- Struts2攔截與文件上傳下載

com custom public 面向切面 lang down pri 多功能 art 一、struts2中的攔截器(框架功能核心) 1、過濾器VS攔截器 過濾器VS攔截器功能是一回事。過濾器是Servlet規範中的技術,能夠對請求和響應進行過濾。

Struts2攔截和過濾器的區別?

tex ext struts 依賴 上下 生命周期 action 上下文 區別 ①過濾器依賴於Servlet容器,而攔截器不依賴於Servlet容器。 ②Struts2 攔截器只能對Action請求起作用,而過濾器則可以對幾乎所 有請求起作用。 ③攔截器可以訪問 Actio

Struts2攔截 解決登錄問題

pan on() string ldr 一個 rect ive 登錄問題 request 一、了解Struts2 攔截器【Interceptor】 攔截器的工作原理如圖 攔截器是由每一個action請求(request)都包裝在一系列的攔截器的內部,通過redire

Struts2攔截說明

調用 array intercept src pan pre left on() 主函數 有關於Struts2的攔截器的原理 在此共設置了兩個攔截器,firstInterception、SecondInterception 1 package struts2_intec

Mybatis攔截之資料許可權過濾與分頁整合

解決方案之改SQL 原sql SELECT a.id AS "id", a.NAME AS "name", a.sex_cd AS "sexCd", a.org_id AS "orgId", a.STATUS AS "status", a.create_org_id AS "createOrgId"

struts2攔截和檔案上傳下載

一、攔截器(Interceptor) 攔截器是動態攔截Action呼叫的物件,攔截器將Action共用的行為獨立出來,在Action執行前後執行。這也就是我們所說的AOP,它是分散關注的程式設計方法,它將通用需求功能從不相關類之中分離出來;同時,能夠共享一個行為,一旦行為發生變化,不必修改很

第19講 struts2攔截-登陸驗證

1在HeadFirstStruts2chapter03中,新建com.cruise.model包,新建User類,屬性userName,password,package com.cruise.model;public class User {   &

分享知識-快樂自己:Struts2 攔截 與 過濾器

攔截器的使用以及配置: package com.gdbd.interceptor; import com.gdbd.pojo.UserInfo; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwor

struts2攔截與檔案上傳、下載

1、攔截器 定義一個action。. TestAction.java package com.zking.study.five; /** * 用於測試的action,與普通action沒啥區別 */ public class TestAction{ public Str

Struts2攔截和檔案上傳

  攔截器 首先需要建立一個攔截器OneInterceptor可以實現implements Interceptor介面       也可以繼承extends AbstractInterceptor類注意這裡用的是xwork2包下面的 package

基於mybatis攔截實現資料許可權

資料許可權是很多系統常見的功能,實現的方式也是很多的,最近在做專案的時候,自己基於mybatis攔截器做了一個數據許可權的功能。 **功能設計 a)  需要做資料許可權功能的表加上一個許可權id欄位。 許可權id可以不僅僅是組織,還可以是其他自定義的欄位,用來做資料許可權,

Struts2攔截再認識

攔截器(Interceptor)是 Struts 2 的核心組成部分。 Struts2 很多功能都是構建在攔截器基礎之上的,例如檔案的上傳和下載、國際化、資料型別轉換和資料校驗等等。 Struts2 攔截器在訪問某個 Action 方法之前或之後實施攔截 Struts2 攔截器是可插拔的, 攔截器是

struts2攔截的執行原理以及攔截和過濾器的區別

struts2攔截器的執行原理:     注意:struts2.1.3以後的版中下邊這張圖中的FilterDispatcher已經改為StrutsPrepareAndExecuteFilter     1.首先伺服器接受請求,首先載入web.xml,通過核心控制器Stru