Struts2---->自定义interceptor
Struts2 自定义拦截器
一、拦截器定义,一般有两种方式
1、实现Interceptor接口
public interface Interceptor extends Serializable{ public void init(); public void destroy(); public String intercept(ActionInvocation invocation)(); }
2、继承AbstractInterceptor类,重写intercept()方法即可
此方法更可行,其实AbstractInterceptor类也就是实现了Interceptor接口
invocation.invoke();表示该方法执行完后执行Action的execute()方法或者执行下一个拦截器 invocation.getAction(); 可以将该法强制转换为Action的类类型
3、方法拦截器:继承MethodFilterInterceptor类,重写doIntercept()方法
MethodFilerInterceptor实现方法过滤中用到的两个参数
execludeMethods:该参数指定拦截器拒绝拦截的方法列表,多个方法用“,”隔开,指定了这个参数,拦截器不会拦截指定列表中的方法,就是所谓的黑名单
includeMethods:该参数指定拦截器需要拦截的方法列表,如果指定了参数,则指定的Action在执行前会被拦截,即白名单。
二、使用自定义拦截器
1、包内定义拦截器
<package....> <interceptors> <interceptor name="myinterceptor" class="...."> </interceptor> </interceptors> </package>
2、action内使用拦截器
<action .....> <result.....></result> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="myinterceptor"></interceptor-ref> </action>
主要:可以看出使用了自定义拦截器的action要配置默认拦截器的引用,因为默认拦截器包含了参数的读取、session的管理等功能
三、例子代码
PermissionInterceptor.java
package com.interceptor; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor; /** * 限制没有登录的用户进入访问页面 */ @SuppressWarnings("serial") public class PermissionInterceptor implements Interceptor { public void destroy() { } public void init() { System.out.println("自定义interceptor执行"); } public String intercept(ActionInvocation invocation) throws Exception { Object user = ActionContext.getContext().getSession().get("user"); // 如果user不为null,代表用户已经登录,允许执行action中的方法 if (user != null){ System.out.println("用户已经登录"); return invocation.invoke(); } System.out.println("用户没有登录"); ActionContext.getContext().put("message", "你没有权限执行该操作"); return "input"; } }
TestAction.java
package com.action; import com.opensymphony.xwork2.ActionSupport; public class TestAction extends ActionSupport { @Override public String execute() throws Exception { System.out.println("执行action"); return super.execute(); } }
struts.xml
<struts> <constant name="struts.devMode" value="true"></constant> <package name="test" namespace="/" extends="struts-default"> <interceptors> <interceptor name="myinterceptor" class="com.interceptor.PermissionInterceptor"></interceptor> </interceptors> <action name="test" class="com.action.TestAction"> <result name="success">/success.jsp</result> <result name="input">/error.jsp</result> <interceptor-ref name="myinterceptor"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </action> </package> </struts>
index.jsp 导航到login.jsp 和quit.jsp
<a href="login.jsp">login.jsp</a> <a href="quit.jsp">quit.jsp</a>
login.jsp 向session添加user,访问action
<% request.getSession().setAttribute("user", "wsz");%> 该页面往session中添加user <a href="test.action">user.action</a>
quit.jsp 从session移除user,访问action
<% request.getSession().removeAttribute("user"); %> 该页面从sessiong中移除user <a href="test.action">user.action</a>
success.jsp
user.action访问成功
error.jsp
user.action访问成功
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律