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

 更新时间:2017年05月09日 10:24:48   作者:阿木侠  
本篇文章主要介绍了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> 
 <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角色登录:

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

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

相关文章

  • Spring Cloud Data Flow初体验以Local模式运行

    Spring Cloud Data Flow初体验以Local模式运行

    这篇文章主要介绍了Spring Cloud Data Flow初体验以Local模式运行,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • 详解SpringMVC注解版前台向后台传值的两种方式

    详解SpringMVC注解版前台向后台传值的两种方式

    本篇文章主要介绍了详解SpringMVC注解版前台向后台传值的两种方式,具有一定的参考价值,有兴趣的可以了解一下。
    2017-04-04
  • springboot实现小程序支付的项目实践

    springboot实现小程序支付的项目实践

    本文主要介绍了springboot实现小程序支付的项目实践, 可以通过调用微信支付 API 实现支付功能,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • java读取配置文件自定义字段(yml、properties)

    java读取配置文件自定义字段(yml、properties)

    本文主要介绍了java读取配置文件自定义字段(yml、properties),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • 解读Spring MVC的工作流程

    解读Spring MVC的工作流程

    SpringMVC的工作流程是基于模型-视图-控制器(MVC)设计模式的一个典型实现,主要包括用户发送请求到前端控制器(DispatcherServlet)、前端控制器转发请求给处理器映射器(HandlerMapping)
    2025-01-01
  • 完美解决java读取大文件内存溢出的问题

    完美解决java读取大文件内存溢出的问题

    下面小编就为大家带来一篇完美解决java读取大文件内存溢出的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Spring Boot实战之逐行释义Hello World程序

    Spring Boot实战之逐行释义Hello World程序

    spring boot 是基于Spring的一个框架,Spring boot帮我们集成很多常用的功能,使得整个配置更加简单。这篇文章主要介绍了Spring Boot实战之逐行释义Hello World,需要的朋友可以参考下
    2017-12-12
  • java中Statement 与 PreparedStatement接口之间的关系和区别

    java中Statement 与 PreparedStatement接口之间的关系和区别

    这篇文章主要介绍了java中Statement 与 PreparedStatement接口之间的关系和区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Java超详细讲解类的继承

    Java超详细讲解类的继承

    继承就是可以直接使用前辈的属性和方法。自然界如果没有继承,那一切都是处于混沌状态。多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作
    2022-04-04
  • java解析Excel文件的方法实例详解

    java解析Excel文件的方法实例详解

    在日常工作中,我们常常会进行文件读写操作,除去我们最常用的纯文本文件读写,更多时候我们需要对Excel中的数据进行读取操作,下面这篇文章主要给大家介绍了关于java解析Excel文件的方法,需要的朋友可以参考下
    2022-06-06

最新评论