SSH框架下访问控制设计方案

转载请注明出处:jiq•钦's technical Blog

在SSH框架之下,最基本的是要实现访问控制。

主要思想就是使用拦截器控制action的访问,使用jsp代码控制jsp页面的访问。


拦截器需要指定拦截除了LoginAction和LogoutAction之外的所有Action

一般是声明一些拦截器拦截器,然后将某些拦截器组合成拦截器栈:

<!-- 定义拦截器,在用户访问受保护资源之前判断其是否登录 -->

<interceptors>

    <!-- 拦截器 -->

    <interceptor name="authen" class="com.jsjl.interceptor.LoginAuthenInterceptor"/>

          

    <!-- 定义一个拦截器栈 -->

    <interceptor-stack name="securityStack">

       <interceptor-ref name="defaultStack"/>

       <interceptor-ref name="authen"/>

    </interceptor-stack>

</interceptors>

然后在Action配置中制定需要使用的拦截器:

<action name="yndwAction"class="YNDWAction">

    <result name="success">yndw_1.jsp</result>

    <result name="error">error.jsp</result>

    <interceptor-refname=”securityStack” />

</action>

但是不可能在所有的Action配置中都加上

<interceptor-ref name=”securityStack” />

 

解决方案:

1 Action访问控制

新建1+1+n个包

第一个包声明登入登出等不需要拦截的Action:

<package name="login"extends="struts-default" namespace="/">     

<!-- class属性对应IoC容器中的BeanId,因为strutsAction托管给Spring -->

    <action name="login" class="LoginAction">

       <result name="yndw"type="redirectAction">

           <param name="actionName">yndwAction</param>

           <param name="namespace">/</param>

       </result>

       <!—因为使用了struts2的框架验证,所以必须配置input接过类型,验证失效时候

返回input结果,若找不到input类型,就会尝试用actionclass去创建一个

action,导致action未知类型的错误 -->

       <result name="input">/login.jsp</result>

    </action>    

    <action name="logoutAction" class="LogoutAction">

       <result name="success">login.jsp</result>

    </action>

</package>


第二个包声明拦截器,然后定义为默认拦截器:

<package name="interceptor"extends="struts-default" namespace="/">

    <!-- 定义拦截器,在用户访问受保护资源之前判断其是否登录 -->

    <interceptors>

       <!-- 拦截器 -->

       <interceptor name="authen" class="com.jsjl.interceptor.LoginAuthenInterceptor" />

       <!-- 定义一个拦截器栈 -->

       <interceptor-stack name="securityStack">

           <interceptor-ref name="defaultStack" />

           <interceptor-ref name="authen" />

       </interceptor-stack>

    </interceptors>     

    <!-- 在这个包中声明一个默认的拦截器对于action资源直接访问,使用拦截器,对于页面直接访问,页面中判断-->

    <default-interceptor-ref name="securityStack"/>     

    <!-- 如果一个结果在多个Action或者拦截器中使用,就应该将其配置为全局结果,注意类型为redirect -->

    <global-results>

       <result name="login"type="redirect">/login.jsp</result>

    </global-results>

</package>


然后其他N和包,都继承自第二个包,这样就默认继承了第二个包的默认的拦截器:

<package name="XXX"extends="interceptor" namespace="/">

就这样,访问除了第一个包中的所有Action都会通过拦截器判断用户是否登入,否则转到登陆页面。


拦截器是这样的:

public class LoginAuthenInterceptor extends AbstractInterceptor {

    public String intercept(ActionInvocation invocationthrows Exception {

       ActionContext context = ActionContext.getContext();

       Map session = context.getSession();

       Object user = session.get("isLogin");

       if(user == null){

           return"login";

       }

       return invocation.invoke();

    }

}


2 JSP访问控制

然后对于jsp页面的访问控制,只需要在页面开始加上以下几句即可:

<%

    Object isLogin = session.getAttribute("isLogin");

    if(isLogin == null){    

       response.sendRedirect("login.jsp");

    }

%>


你可能感兴趣的:(SSH框架下访问控制设计方案)