Struts2中拦截器的使用

拦截器(Interceptor),主要完成请求参数的解析、将页面表单参数赋给值栈中相应属性、执行功能检验、程序异常调试等工作求中极易出现中文乱码问题。每一个Action请求都包装在一系列的拦截器的内部,拦截器可以在Action执行之前做相似的操作也可以在Action执行之后做回收操作。Action可以将操作转交给下面的拦截器,也可以直接退出操作返回既定的页面。我以下要讲的是用户登录检查。
1.先定义一个类实现com.opensymphony.xwork2.interceptor.Interceptor接口,示例代码:

package com.gx.intercepter;

import java.util.Map;

import com.gx.po.User;
import com.gx.web.LoginAction;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class LoginIntercepter implements Interceptor{
    
    

    /**
     *
     */
    private static final long serialVersionUID = 1L;

    //Destroy方法在拦截器被垃圾回收之前调用,用来回收init方法初始化的资源
    @Override
    public void destroy() {
    
    
        System.out.println("LoginIntercepter 回收");
    }

    @Override
    public void init() {
    
    
        System.out.println("LoginIntercepter 初始化");

    }

    @Override
    public String intercept(ActionInvocation actionInvocation) throws Exception {
    
    
        //排除登录Action
        Object action= actionInvocation.getAction();//获取action
        if (action instanceof LoginAction) {
    
    
            System.out.println("LoginAction 退出拦截器");
            return actionInvocation.invoke();
        }

        //获取session
        Map<String, Object> session= actionInvocation.getInvocationContext().getSession();
        User pfUser=(User) session.get("pfUser");
        if (pfUser!=null && pfUser.getUserName().length()>0) {
    
    
            System.out.println("已经登录,退出拦截器");
            return actionInvocation.invoke();
        }else{
    
    
            System.out.println("没有登录,跳转到登录页面");
            return "login";//对应全局的返回变量
        }
    }
}

2.strurs2.xml中拦截器(Interceptor)的配置,将拦截器设置为全局的。需要注意的是拦截器必须定义在被继承之前,还有就是不要忘记添加默认拦截器栈,不然Struts2的一些功能无法正常运行。示例代码:

<package name="base-package" extends="struts-default">
	<interceptors>
		<!-- 声明自定义拦截器 -->
		<interceptor name="loginIntercepter" class="com.gx.intercepter.LoginIntercepter">
		</interceptor>
		<!-- 配置拦截栈 -->
		<interceptor-stack name="myStack">
			<!-- 添加自定义的拦截器 -->
			<interceptor-ref name="loginIntercepter"></interceptor-ref>
			<!-- 添加默认的拦截器栈 -->
			<interceptor-ref name="defaultStack"></interceptor-ref>
		</interceptor-stack>
	</interceptors>
	
	<!-- 设置当前 namespace的默认拦截器栈 -->
	<default-interceptor-ref name="myStack"></default-interceptor-ref>
	<!-- 配置全局的返回 -->
	<global-results>
		<result name="login" type="redirect">/jsp/intercepter/login.jsp</result>
	</global-results>
</package>

<package name="intercepterDemo" namespace="/intercepterDemo" extends="base-package">
	<action name="loginAction" class="com.gx.web.LoginAction">
		<result name="success" type="redirectAction">
			<param name="namespace">/intercepterDemo</param>
			<param name="actionName">testAction</param>
			<param name="method">index</param>
		</result>
		<result name="error">/jsp/fail.jsp</result>
	</action>
	<action name="testAction" class="com.gx.web.TestAction" method="index">
		<result name="success">/jsp/intercepter/test.jsp</result>
	</action>
</package>

猜你喜欢

转载自blog.csdn.net/weixin_44547592/article/details/106836896