欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

struts2如何使用拦截器进行用户权限控制实例

程序员文章站 2024-02-22 13:59:58
大多数网站会设置用户权限,如过滤非法用户,用户不登录时不能进行访问,或者设置访问的权限,如部分内容仅对vip开放等等,这些权限的控制都可以用struts2中的拦截器来实现。...

大多数网站会设置用户权限,如过滤非法用户,用户不登录时不能进行访问,或者设置访问的权限,如部分内容仅对vip开放等等,这些权限的控制都可以用struts2中的拦截器来实现。

下面通过一个简单的demo来模拟这种用户权限控制的实现流程,设定三种不同身份的用户,commen为普通用户,vip为会员用户,还有一种admin为管理员。

先看一下demo的整体结构:

struts2如何使用拦截器进行用户权限控制实例

首先搭建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> 
 <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%>" 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角色登录:

struts2如何使用拦截器进行用户权限控制实例

点击vip以及admin跳转链接时:

struts2如何使用拦截器进行用户权限控制实例

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。