Struts2 利用拦截器 interceptor 控制登陆和访问权限
最近学习了Struts2的登录和权限控制用到的是拦截器,需要在struts.xml中配置,每个action都默认的继承defaultStack,如果你用了别的拦截器,还需要手动引入defaultStack。因为登录和访问权限拦截是全局的,拦截返回的结果有些也是全局的,所以我定义了自己的package以便引用。我是这样写的:
==================================================================================================
< package name="struts-my" extends="struts-default">
< interceptors>
< !--判断是否登录 和 是否有访问权限 -->
< interceptor name="auth" class="athenticationInterceptor" />
< interceptor-stack name="myStack">
< interceptor-ref name="auth">< /interceptor-ref>
< interceptor-ref name="defaultStack">< /interceptor-ref>
< /interceptor-stack>
< /interceptors>
< default-interceptor-ref name="myStack">< /default-interceptor-ref>
< !-- 全局结果 -->
< global-results>
< !-- 拦截没登录返回结果 -->
< result name="noLogin" type="redirect">/jsp/no_login.jsp< /result>
< !-- 拦截没有权限返回结果 -->
< result name="noPower" type="redirect">/jsp/no_power.jsp< /result>
< /global-results>
< /package>
< package name="default" extends="struts-my">
< !--登录登出不需要拦截 让它们已入 defaultStack-->
< action name="login" class="loginAction" method="login">
< result name="input">/jsp/login.jsp< /result>
< result name="success" type="redirect">/jsp/index.jsp< /result>
< interceptor-ref name="defaultStack">< /interceptor-ref>
< /action>
< action name="logout" class="loginAction" method="logout">
< result name="success">/jsp/login.jsp< /result>
< interceptor-ref name="defaultStack">< /interceptor-ref>
< /action>
。。。。。。。。。
==================================================================================================
需要说明的是,登录和登出是不需要拦截的(或者其它不需要拦截的),我们让它们的拦截器继承defaultStack。局部权限高于全局定义的,它们的拦截器栈就是默认的,不是自定义的。
还有一点要说明的是我,我拦截器的名字auth引用的类是在Spring里面配置的一个bean,我用的是SSH,在类里面我用到了一些数据库的东西,我需要在Spring里注入。如果不需要可以直接写用到的类(要写路径)。
在登陆成功后,我把“user”放到了session中,我还有一张权限表,里面存的是权限组id和访问的权限。用户表里存放权限组id,这样就可以知道用户有什么权限了。我实现拦截的类是这样写的。
==================================================================================================
public class AuthenticationInterceptor extends AbstractInterceptor {
//这个是需要用到的自定义的方法。
private GroupPowerService groupPowerService;
public String intercept(ActionInvocation invocation) throws Exception {
Map map= invocation.getInvocationContext().getSession();
if (map.get("user")==null)
{
return "noLogin";
}
else
{
//得到用户的权限id 和 访问的类名
int id = ((User)map.get("user")).getGroupId();
//拦截的action的名字
String action = invocation.getInvocationContext().getName();
//通过用户id 和拦截的action名判断用户是否有这个权限
if(this.groupPowerService.hasPower(id,action))
//继续执行 不拦截
return invocation.invoke();
return "noPower";
}
}
public GroupPowerService getGroupPowerService() {
return groupPowerService;
}
==================================================================================================
还有两个jsp页面和一个在Spring的配置文件里的一句话(这里拦截器和action一样,用到什么sevice用注入什么)就没什么可说的了。

==================================================================================================
< package name="struts-my" extends="struts-default">
< interceptors>
< !--判断是否登录 和 是否有访问权限 -->
< interceptor name="auth" class="athenticationInterceptor" />
< interceptor-stack name="myStack">
< interceptor-ref name="auth">< /interceptor-ref>
< interceptor-ref name="defaultStack">< /interceptor-ref>
< /interceptor-stack>
< /interceptors>
< default-interceptor-ref name="myStack">< /default-interceptor-ref>
< !-- 全局结果 -->
< global-results>
< !-- 拦截没登录返回结果 -->
< result name="noLogin" type="redirect">/jsp/no_login.jsp< /result>
< !-- 拦截没有权限返回结果 -->
< result name="noPower" type="redirect">/jsp/no_power.jsp< /result>
< /global-results>
< /package>
< package name="default" extends="struts-my">
< !--登录登出不需要拦截 让它们已入 defaultStack-->
< action name="login" class="loginAction" method="login">
< result name="input">/jsp/login.jsp< /result>
< result name="success" type="redirect">/jsp/index.jsp< /result>
< interceptor-ref name="defaultStack">< /interceptor-ref>
< /action>
< action name="logout" class="loginAction" method="logout">
< result name="success">/jsp/login.jsp< /result>
< interceptor-ref name="defaultStack">< /interceptor-ref>
< /action>
。。。。。。。。。
==================================================================================================
需要说明的是,登录和登出是不需要拦截的(或者其它不需要拦截的),我们让它们的拦截器继承defaultStack。局部权限高于全局定义的,它们的拦截器栈就是默认的,不是自定义的。
还有一点要说明的是我,我拦截器的名字auth引用的类是在Spring里面配置的一个bean,我用的是SSH,在类里面我用到了一些数据库的东西,我需要在Spring里注入。如果不需要可以直接写用到的类(要写路径)。
在登陆成功后,我把“user”放到了session中,我还有一张权限表,里面存的是权限组id和访问的权限。用户表里存放权限组id,这样就可以知道用户有什么权限了。我实现拦截的类是这样写的。
==================================================================================================
public class AuthenticationInterceptor extends AbstractInterceptor {
//这个是需要用到的自定义的方法。
private GroupPowerService groupPowerService;
public String intercept(ActionInvocation invocation) throws Exception {
Map map= invocation.getInvocationContext().getSession();
if (map.get("user")==null)
{
return "noLogin";
}
else
{
//得到用户的权限id 和 访问的类名
int id = ((User)map.get("user")).getGroupId();
//拦截的action的名字
String action = invocation.getInvocationContext().getName();
//通过用户id 和拦截的action名判断用户是否有这个权限
if(this.groupPowerService.hasPower(id,action))
//继续执行 不拦截
return invocation.invoke();
return "noPower";
}
}
public GroupPowerService getGroupPowerService() {
return groupPowerService;
}
==================================================================================================
还有两个jsp页面和一个在Spring的配置文件里的一句话(这里拦截器和action一样,用到什么sevice用注入什么)就没什么可说的了。
form: http://blog.sina.com.cn/s/blog_7d0c4ede0100tfdv.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!