服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|编程技术|正则表达式|

服务器之家 - 编程语言 - JAVA教程 - struts2如何使用拦截器进行用户权限控制实例

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

2020-09-27 15:50阿木侠 JAVA教程

本篇文章主要介绍了struts2如何使用拦截器进行用户权限控制实例,非常具有实用价值,需要的朋友可以参考下

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

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

先看一下Demo的整体结构:

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

首先搭建struts2框架的开发环境(前面博客中有介绍),环境搭建完之后又再看一看如何配置struts.xml:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?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类,不做处理,全部放行,让拦截器处理:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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(拦截器类):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<%@ 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>

拦截后跳转页:

?
1
2
3
<body>
 <h4>你的权限不足,请先升级权限...</h4>
 </body>

访问资源代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%@ 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

延伸 · 阅读

精彩推荐