欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Struts2框架的struts.xml文件的登录拦截器的配置和使用

程序员文章站 2022-05-28 17:06:40
...

struts.xml 的文件程序:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">

<struts>
    <constant name="struts.enable.SlashesInActionNames" value="true"/><!--将斜杠‘/’允许作为通配符使用-->
    <constant name="struts.enable.DynamicMethodInvocation" value="true"/><!--允许action动态调用方法-->
    <package name="finebi" namespace="/" extends="struts-default">
        <interceptors>
            <!--登录验证拦截器-->
            <interceptor name="loginInvocation" class="cominvocation.LoginInvocation"/>
            <interceptor-stack name="myStack"><!--自定义拦截器栈-->
                <interceptor-ref name="defaultStack"/><!--必须使用默认拦截器栈,否则无法调用参数-->
                <interceptor-ref name="loginInvocation"/><!--调用登录验证拦截器-->
            </interceptor-stack>
        </interceptors>
        <default-interceptor-ref name="myStack"/><!--重新调用默认拦截器栈-->
        <global-results>
            <result name="login">index.jsp</result><!--公共默认结果集,该包中所有action有返回结果是login都可以在此返回页面显示-->
        </global-results>
        <global-allowed-methods>regex:.*</global-allowed-methods><!--允许使用*表示动态通配符-->

        <action name="loginAction" class="com.action.LoginAction">
            <interceptor-ref name="defaultStack"/><!--登录Action不能使用登录验证拦截器,必须使用默认拦截器,否则便永远无法登录-->
            <result>/AllListView.jsp</result>
        </action>

        <action name="HRAction/*" class="com.action.HRAction" method="{1}">
            <result name="HR_list">/HR/hr_overtimelist.jsp</result>
            <result name="HR_updateview">/HR/HR_updateview.jsp</result>
            <result name="HR_intoInsertView">/HR/HR_insertview.jsp</result>
        </action>

    </package>
</struts>

总结
简单的登录拦截器的使用,
首先,使用登录拦截器时要先定义名称,并获取其完整的类名:

 <interceptor name="loginInvocation" class="cominvocation.LoginInvocation"/>

接着创建一个自己的拦截器栈

  <interceptor-stack name="myStack"><!--自定义拦截器栈-->
		<interceptor-ref name="defaultStack"/><!--必须使用默认拦截器栈,否则无法调用参数-->
        <interceptor-ref name="loginInvocation"/><!--调用登录验证拦截器-->
  </interceptor-stack>

注意点:一定要在自定义的拦截器栈中的第一行就加上系统默认的拦截器栈,否则无法传递参数。
之后再调用自己的编写的拦截器。
另外如果自己编写了多个拦截器时,在定义拦截器名称和调用拦截器时应满足先定义后调用的顺序;比如
定义的拦截器有 invocation1,invocation2,invocation3
而在调用时 必须是 invocation3,invocation2,invocation1

创建的拦截器和拦截器栈必须在 “interceptors” 标签中。

创建完自己的拦截器和拦截器栈后,必须要设置重新调用自己的拦截器栈,
即使用如下程序:

    <!--重新调用默认拦截器栈-->
<default-interceptor-ref name="myStack"/>

它必须在“interceptors” 标签的后面。

依据上述方法创造的拦截器,最大的好处就是,以下所有的Action中,都无需再写调用拦截器的程序,系统自动默认调用拦截器栈。
另外由于登录页面是不能使用这个登录拦截器栈的。否则就永远处于登录界面,无法跳转了。所以在登录的Action中不能使用自己写的拦截器栈,想要做到这一点,只需要在登录的Action中调用系统的拦截器栈即可。

在登录Action中使用登录验证分方法是:

public String execute()
    {
      if (username.equals("zhangsan")&&password.equals("111"))//验证用户名是否有合法的登录信息
        {
            ActionContext.getContext().getSession().put("username",username);//登录验证令牌
            return SUCCESS;
        }
        return "login";//不是合法用户就返回登录页面
    }

制作一个登陆令牌用于登录拦截器中验证是否登陆。

登录拦截器中的代码:

 @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        ActionContext actionContext=invocation.getInvocationContext();
        if(null==actionContext.getSession().get("username")||
                "".equals(actionContext.getSession().get("username"))||
                "null".equals(actionContext.getSession().get("username")))
        {
            return "login";//使用拦截器,发现没有登录则返回登录界面,
        }
        return invocation.invoke();//如果登录了就传到下一个拦截器或回到Action中
    }

这样一个登陆拦截器就可以使用了。