struts2如何使用拦截器进行用户权限控制实例
发布时间 - 2026-01-11 01:02:25 点击率:次大多数网站会设置用户权限,如过滤非法用户,用户不登录时不能进行访问,或者设置访问的权限,如部分内容仅对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跳转链接时:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# struts2权限控制
# struts2权限拦截器
# struts2的权限拦截
# struts2自定义拦截器的示例代码
# Struts2之Action接收请求参数和拦截器详解
# Struts2拦截器登录验证实例
# JSP 开发之Struts2内建自定义拦截器
# Java的Struts2框架中拦截器使用的实例教程
# JavaWeb中Struts2拦截器深入分析(一)
# struts2过滤器和拦截器的区别分析
# Struts拦截器实现拦截未登陆用户实例解析
# 拦截器
# 跳转
# 就会
# 多个
# 有很多
# 可以用
# 中有
# 请先
# 转到
# 三种
# 不做
# 可以使用
# 可供
# 不符合
# 与之
# 表单
# 来实现
# 方法来
# 先看
# 普通用户
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在建站之星网店版论坛获取技术支持?
Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】
如何快速搭建FTP站点实现文件共享?
如何在阿里云购买域名并搭建网站?
nginx修改上传文件大小限制的方法
瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口
百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
Laravel怎么生成URL_Laravel路由命名与URL生成函数详解
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
如何快速搭建安全的FTP站点?
如何在万网ECS上快速搭建专属网站?
如何在IIS中配置站点IP、端口及主机头?
,网页ppt怎么弄成自己的ppt?
如何在局域网内绑定自建网站域名?
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
Laravel如何与Inertia.js和Vue/React构建现代单页应用
Java垃圾回收器的方法和原理总结
使用spring连接及操作mongodb3.0实例
python中快速进行多个字符替换的方法小结
如何在万网开始建站?分步指南解析
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
教你用AI将一段旋律扩展成一首完整的曲子
Laravel模型关联查询教程_Laravel Eloquent一对多关联写法
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
浅谈javascript alert和confirm的美化
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】
Thinkphp 中 distinct 的用法解析
如何用狗爹虚拟主机快速搭建网站?
详解vue.js组件化开发实践
Laravel如何使用Eloquent进行子查询
作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】
Linux网络带宽限制_tc配置实践解析【教程】
Laravel如何使用Service Container和依赖注入?(代码示例)
php485函数参数是什么意思_php485各参数详细说明【介绍】
昵图网官网入口 昵图网素材平台官方入口
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
iOS验证手机号的正则表达式
英语简历制作免费网站推荐,如何将简历翻译成英文?
如何快速辨别茅台真假?关键步骤解析
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】
Laravel安装步骤详细教程_Laravel环境搭建指南
iOS正则表达式验证手机号、邮箱、身份证号等
打造顶配客厅影院,这份100寸电视推荐名单请查收
海南网站制作公司有哪些,海口网是哪家的?
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
上一篇:排查线上问题的9种方式
上一篇:排查线上问题的9种方式

