struts2拦截器使用(部分拦截和全局拦截器)
程序员文章站
2022-05-28 15:50:34
...
应用场景:在请求处理之前拦截请求,做出相关处理。比如在一个网站中,用户尚未登录那么他是无法查看个人信息界面的。这时候我们就可以使用拦截器来拦截他访问个人信息的界面的请求。具体如下(这里主要是struts2自定义拦截器的方法):
struts2自定义拦截器:
1 实现Iterceptor接口或者继承AbstractInterceptor
2 在struts.xml文件配置拦截器
3 在需要使用拦截器的action中引用上述拦截器(部分拦截),也可以将上述拦截器定义为默认拦截器(全局拦截),这样可以拦截所有请求
部分拦截
1 本案例是自定义拦截器是继承AbstractInterceptor:
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class LoginInterceptor extends AbstractInterceptor {
private static final long serialVersionUID = -4334179734031489644L;
@Override
public String intercept(ActionInvocation actionInvocation) throws Exception {
Object action=actionInvocation.getAction();
System.out.println(action.toString()+"========="+action);
String user=(String) actionInvocation.getInvocationContext().getSession().get("user");
if(user==""||user==null){
System.out.println("尚未登录拦截请求,返回登录界面");
return "login";
}
return actionInvocation.invoke();
}
}
2 在struts.xml配置拦截器:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<constant name="struts.devMode" value="true"></constant>
<package name="student" extends="struts-default" namespace="/">
<interceptors>
<interceptor name="logins" class="com.yc.interceptor.LoginInterceptor">
</interceptor>
</interceptors>
<global-results> <!--定义全局Result-->
<result name="login">/index.jsp</result>
</global-results>
<!--登录-->
<action name="login" class="com.yc.controller.LoginAction" method="login">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
<action name="add" class="com.yc.controller.AddAction" method="add">
<result name="success">/index.jsp</result>
<result name="error">/register.jsp</result>
</action>
<action name="update" class="com.yc.controller.UpdateAction" method="update">
<result name="success">/index.jsp</result>
<interceptor-ref name="defaultStack"/> <!--在需要拦截的地方引入拦截器-->
<interceptor-ref name="logins"/>
</action>
<action name="del" class="com.yc.controller.DelAction" method="del">
<result name="success">/index.jsp</result>
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="logins"/>
</action>
</package>
全局拦截:
思路如下在一个<package>(假如叫做A)里定义好拦截器,并且通过<default-interceptor-ref>设置成默认拦截器,然后在另一个<package>(假如叫做B)继承它,那么B中的所有action将被拦截到:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<constant name="struts.devMode" value="true">
</constant>
<package name="all" extends="struts-default" namespace="/">
<interceptors>
<interceptor name="global" class="com.yc.interceptor.LoginInterceptor"></interceptor>
<interceptor-stack name="myglobal">
<interceptor-ref name="global"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myglobal"></default-interceptor-ref>
</package>
<package name="student" extends="all" namespace="/">
<global-results>
<result name="login">/index.jsp</result>
</global-results>
<action name="login" class="com.yc.controller.LoginAction" method="login">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
<action name="add" class="com.yc.controller.AddAction" method="add">
<result name="success">/index.jsp</result>
<result name="error">/register.jsp</result>
</action>
<action name="update" class="com.yc.controller.UpdateAction" method="update">
<result name="success">/index.jsp</result>
</action>
<action name="del" class="com.yc.controller.DelAction" method="del">
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
上一篇: struts2上传文件以及拦截器配置
推荐阅读