如何在struts2中进行URL身份验证

时间:2010-06-09 21:53:13

标签: spring struts2 iinterceptor

我正在使用struts2.1.6 + Spring 2.5我的应用程序中有四个模块。

  1. 注册模块
  2. 管理模块
  3. 报价模块
  4. 位置模块。
  5. 在注册模块中,客户可以自行注册,只有在注册后才能访问其余三个模块。

    我想实现一些事情,例如,如果被调用的动作属于注册模块,它将正常工作,但如果被调用的动作属于这三个模块的其余部分,则首先应该检查用户是否已登录并且会话没有超时。如果是,它应该正常进行,否则它应该重定向到登录页面。

    通过研究我发现拦截器可以用于此目的但在继续之前我认为最好从专家那里得到一些反馈。

    请建议如何进行,如果可能,请提供一些代码建议。

    这是我的 struts.xml 文件(struts.xml包含属于每个模块的四个不同的配置文件):

        <struts>
        <include file="struts-default.xml" />
        <constant name="struts.i18n.reload" value="false" />
        <constant name="struts.objectFactory" value="spring" />
        <constant name="struts.devMode" value="false" />
        <constant name="struts.serve.static.browserCache" value="false" />
        <constant name="struts.enable.DynamicMethodInvocation" value="true" />
        <constant name="struts.multipart.maxSize" value="10000000" />
        <constant name="struts.multipart.saveDir" value="C:/Temporary_image_location" />
    
        <include file="/com/action/mappingFiles/registration_config.xml" />
        <include file="/com/action/mappingFiles/admin_config.xml" />
        <include file="/com/action/mappingFiles/quote.xml" />
        <include file="/com/action/mappingFiles/location_config.xml" />
    
    </struts>
    

    示例 registration_config.xml 文件是:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
    <struts>
        <package name="registration" extends="struts-default"
            namespace="/my_company">
    
            <action name="LoginView" class="registration" method="showLoginView">
                <result>....</result>
                <result name="input">...</result>
            </action>
             </package>
    </struts>
    

    示例 admin_config.xml 文件是:

    <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
        <struts>
            <package name="admin" extends="struts-default"
                namespace="/my_company">
    
                <action name="viewAdmin" class="admin" method="showAdminView">
                    <result>....</result>
                    <result name="input">...</result>
                </action>
                 </package>
        </struts>
    

    两个struts2 xml配置文件的其余部分都有相同的代码。我在使用不同包名的所有四个配置文件中使用了相同的命名空间(如您所见)

1 个答案:

答案 0 :(得分:0)

注意:标准做法是为每个包使用不同的命名空间,例如:管理包等的“/ my_company / admin”等。

使用拦截器是正确的方法:它将身份验证与操作本身分离。您可以定义两个不同的拦截器堆栈,一个需要用户登录,另一个不需要。首先从struts-default.xml复制拦截器堆栈,然后根据您的要求进行自定义。这些定义可以放在一个抽象的基础包中:

<package name="my-base" abstract="true" extends="struts-default">
    <interceptors>
        <interceptor-stack name="login-required">
            <interceptor-ref name="exception"/>
            <interceptor-ref name="alias"/>
            <!-- etc -->
        </interceptor-stack>
        <interceptor-stack name="login-not-required">
            <!-- etc -->
        </interceptor-stack>
    </interceptors>
</package>

然后你的其他包只需要扩展这个基础包:

<package name="admin" extends="my-base" namespace="/my_company/admin">
    <default-interceptor-ref name="login-required"/>

    <!-- actions defined here -->
</package>