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跳转链接时:

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

(0)

相关推荐

  • Struts2拦截器登录验证实例

    Struts2拦截器 Struts2拦截器的概念和Spring Mvc拦截器一样. 1.Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现. 2.拦截器栈(Interceptor Stack).Struts2拦截器栈就是将拦截器按一定的顺序联结成一条链.在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用. 使用拦截器的第一步: 自定义我的权限拦截器Chec

  • 详解Struts2中对未登录jsp页面实现拦截功能

    Struts2中拦截器大家都很经常使用,但是拦截器只能拦截action不能拦截jsp页面.这个时候就有点尴尬了,按道理来说没登录的用户只能看login界面不能够通过输入URL进行界面跳转,这显然是不合理的.这里介绍Struts2中Filter实现jsp页面拦截的功能.(有兴趣的人可以去研究Filter过滤器的其它用法,因为利用过滤器也可以实现action拦截的功能) 下面直接上代码,边看边分析实现步骤和原理. 1.web.xml中的配置信息: <filter> <filter-name&

  • Struts2之Action接收请求参数和拦截器详解

    技术分析之在Struts2框架中使用Servlet的API 1. 在Action类中也可以获取到Servlet一些常用的API 需求:提供JSP的表单页面的数据,在Action中使用Servlet的API接收到,然后保存到三个域对象中,最后再显示到JSP的页面上. 提供JSP注册的页面,演示下面这三种方式 <h3>注册页面</h3> <form action="${ pageContext.request.contextPath }/xxx.action"

  • java中的Struts2拦截器详解

    最近在学习struts的拦截器,现在来总结一下. 1.拦截器是什么? 拦截器相当于过滤器:就是将不想要的去掉,想要的留下.拦截器抽象出一部分代码可以用来完善原来的action.同时可以减轻代码冗余,提高重用率.通俗地讲就是一张网,过滤掉不需要的沙子,留下水. 2.拦截器的作用: 拦截器可以构成特定的功能.比如权限认证.日志记录和登陆判断. 3.拦截器的原理: 其每一个Action请求都在拦截器中,每一个action可以将操作转交给下面的拦截器,也可以直接退出到界面上. 4.定义拦截器: (1)自

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

    大多数网站会设置用户权限,如过滤非法用户,用户不登录时不能进行访问,或者设置访问的权限,如部分内容仅对VIP开放等等,这些权限的控制都可以用struts2中的拦截器来实现. 下面通过一个简单的Demo来模拟这种用户权限控制的实现流程,设定三种不同身份的用户,commen为普通用户,VIP为会员用户,还有一种admin为管理员. 先看一下Demo的整体结构: 首先搭建struts2框架的开发环境(前面博客中有介绍),环境搭建完之后又再看一看如何配置struts.xml: <?xml version

  • MyBatis-Plus拦截器实现数据权限控制的示例

    目录 前言背景 上代码(基础版) 进阶版 前言背景 平时开发中遇到根据当前用户的角色,只能查看数据权限范围的数据需求.列表实现方案有两种,一是在开发初期就做好判断赛选,但如果这个需求是中途加的,或不希望每个接口都加一遍,就可以方案二加拦截器的方式.在mybatis执行sql前修改语句,限定where范围. 当然拦截器生效后是全局性的,如何保证只对需要的接口进行拦截和转化,就可以应用注解进行识别 因此具体需要哪些步骤就明确了 创建注解类 创建拦截器实现InnerInterceptor接口,重写查询

  • struts2过滤器和拦截器的区别分析

    本文分析了struts2过滤器和拦截器的区别.分享给大家供大家参考,具体如下: 一.本质区别: 1. 拦截器是基于java的反射机制的,而过滤器是基于函数回调. 2. 拦截器不依赖与servlet容器,过滤器依赖与servlet容器. 3. 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用. 4. 拦截器可以访问action上下文.值栈里的对象,而过滤器不能访问. 5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次 二.使用区别:

  • Mybatis拦截器实现数据权限的示例代码

    在我们日常开发过程中,通常会涉及到数据权限问题,下面以我们常见的一种场景举例: 一个公司有很多部门,每个人所处的部门和角色也不同,所以数据权限也可能不同,比如超级管理员可以查看某张 表的素有信息,部门领导可以查看该部门下的相关信息,部门普通人员只可以查看个人相关信息,而且由于角色的 不同,各个角色所能查看到的数据库字段也可能不相同,那么此处就涉及到了数据权限相关的问题.那么我们该如 何处理数据权限相关的问题呢?我们提供一种通过Mybatis拦截器实现的方式,下面我们来具体实现一下 pom.xml

  • Redis + Java拦截器实现用户匿名和非匿名访问

    目录 需求 实现截图 核心代码 WebMvcConfigurer HandlerInterceptor 判断用户是否有权限 ThreadLocal 该篇文章以<Redis实现短信验证码登录>这篇文章为基础,以Redis和Java拦截器为核心,对登录功能展开研究和应用. 需求 对所有的接口按需分类 一些接口可以匿名访问 一些接口必须登录才可以访问 刷新token 实现截图 获取验证码 用验证码完成登录,并获取token 用token实现访问非匿名访问接口 核心代码 WebMvcConfigure

  • Go WEB框架使用拦截器验证用户登录状态实现

    目录 wego拦截器 main函数 登录逻辑 登录拦截器的实现 index页面的实现 wego拦截器 wego拦截器是一个action(处理器函数)之前或之后被调用的函数,通常用于处理一些公共逻辑.拦截器能够用于以下常见问题: 请求日志记录 错误处理 身份验证处理 wego中有以下拦截器: before_exec :执行action之前拦截器 after_exec :执行action之后拦截器 本文用一个例子来说明如何使用拦截器来实现用户登录状态的判定.在这个例子中,用户访问login_get来

  • Vue2.0用户权限控制解决方案

    Vue-Access-Control是一套基于Vue/Vue-Router/axios 实现的前端用户权限控制解决方案,通过对路由.视图.请求三个层面的控制,使开发者可以实现任意颗粒度的用户权限控制. 安装 版本要求 Vue 2.0x Vue-router 3.x 获取 git:git clone https://github.com/tower1229/Vue-Access-Control.git npm:npm i vue-access-control 运行 //开发 npm run dev

  • Vue-Access-Control 前端用户权限控制解决方案

    Vue-Access-Control是一套基于Vue/Vue-Router/axios 实现的前端用户权限控制解决方案,通过对路由.视图.请求三个层面的控制,使开发者可以实现任意颗粒度的用户权限控制. 整体思路 会话开始之初,先初始化一个只有登录路由的Vue实例,在根组件created钩子里将路由定向到登录页,用户登录成功后前端拿到用户token,设置axios实例统一为请求headers添加{"Authorization":token}实现用户鉴权,然后获取当前用户的权限数据,主要包

  • Vue2.0用户权限控制解决方案的示例

    Vue-Access-Control是一套基于Vue/Vue-Router/axios 实现的前端用户权限控制解决方案,通过对路由.视图.请求三个层面的控制,使开发者可以实现任意颗粒度的用户权限控制. 安装 版本要求 Vue 2.0x Vue-router 3.x 获取 git:git clone https://github.com/tower1229/Vue-Access-Control.git npm:npm i vue-access-control 运行 //开发 npm run dev

  • vue-resource拦截器设置头信息的实例

    使用vue-resource,设置头信息: Vue.http.interceptors.push((request, next) => { request.headers.set('Authorization', token) console.log(request.headers) next(response => { console.log(response.status) return response }) }) 以上这篇vue-resource拦截器设置头信息的实例就是小编分享给大家

随机推荐