struts2如何使用 * 进行用户权限控制实例

作者:阿木侠 时间:2023-02-23 18:14:15 

大多数网站会设置用户权限,如过滤非法用户,用户不登录时不能进行访问,或者设置访问的权限,如部分内容仅对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如何使用 * 进行用户权限控制实例

来源:http://blog.csdn.net/weixin_36380516/article/details/71429800?utm_source=tuicool&utm_medium=referral

标签:struts,权限,控制
0
投稿

猜你喜欢

  • Java中的BufferedInputStream与BufferedOutputStream使用示例

    2021-10-20 01:14:56
  • 详解Springboot Oauth2 Server搭建Oauth2认证服务

    2023-10-20 12:47:59
  • Java JVM运行时数据区(Run-Time Data Areas)

    2022-01-22 22:10:35
  • Android 四种动画效果的调用实现代码

    2021-06-26 17:59:54
  • Android自定义EditText实现淘宝登录功能

    2023-04-20 01:33:04
  • C# JWT权限验证的实现

    2022-11-24 00:57:13
  • Java 单向队列及环形队列的实现原理

    2022-12-10 22:09:11
  • C++实现哈夫曼编码

    2022-07-20 20:39:01
  • Android自定义相机Camera实现手动对焦的方法示例

    2022-08-23 14:45:11
  • 聊聊SpringMVC项目依赖和静态资源导出问题

    2023-03-26 13:32:20
  • Android实现毛玻璃效果的对话框

    2021-07-19 03:28:42
  • 总结C#网络编程中对于Cookie的设定要点

    2021-12-28 20:16:43
  • Java基础之位运算知识总结

    2022-09-10 17:48:43
  • Java Ehcache缓存框架入门级使用实例

    2022-08-23 20:51:54
  • Android自定义控件实现时间轴

    2021-07-12 04:13:08
  • Android 帧动画的实例详解

    2023-02-05 16:09:42
  • 基于Android XML解析与保存的实现

    2023-05-25 18:54:32
  • 浅析Disruptor高性能线程消息传递并发框架

    2023-02-26 14:09:01
  • C# 并行和多线程编程——认识和使用Task

    2022-03-28 05:48:04
  • Java基础之重载(Overload)与重写(Override)详解

    2023-07-31 08:10:25
  • asp之家 软件编程 m.aspxhome.com