前段时间作了一个简单的系统,其中涉及到后台管理,当然也就遇到了权限验证的问题,由于初次做J2EE项目,所有这些东西懂我来说都是个开始。
对于权限验证,如果程序由目录划分,如管理员访问的页面都放在admin下,这样我们可以写一个权限验证的过滤器,然后配置admin目录都要经过这个过滤器即可。这样对于jsp页面的权限验证比较容易。但对于action(控制器类)就不好控制了,因为action是没有目录概念的,如我们访问action的地址为:
http://xxx/sample/ac1.action,同时如果使用
http://xxx/sample/xx/xx/ac1.action同样可以访问,这是因为只要在这个项目目录下,访问的页面如果为action则struts就会去查询这个action名字对应的类,而不管前面的目录结构。因此我们不能再用过滤器对管理员部分的action进行验证。经过查看struts2的相关资料发现了拦截器这个有用的东西。通过struts2的配置文件的包管理功能和拦截器可以轻松的对指定的action做管理(拦截),如
===================================================
<package name="user" extends="struts-default">
<!-- 前台用户操作部分 -->
<!-- 框架页,显示分类 -->
<action name="queryCateForwardUI"
class="com.topsoft.bookmanage.web.action.QueryCateForwardActionUI">
<result>/mainPage.jsp</result>
</action>
。。。。。
</package>
<!-- 管理员操作部分 -->
<package name="manager" extends="struts-default">
<!-- 拦截器 -->
<interceptors>
<interceptor name="auth" class="com.topsoft.common.LogonInterceptor" />
<interceptor-stack name="authStack">
<interceptor-ref name="auth"/>
<interceptor-ref name="paramsPrepareParamsStack"/>
</interceptor-stack>
</interceptors>
<!-- 默认执行的拦截器 -->
<default-interceptor-ref name="authStack"/>
<!-- 全局Action映射 -->
<global-results>
<result name="login" type="redirect">/managerLoginUI.action</result>
</global-results>
<!-- 后台管理首页面UI -->
<action name="managerIndexUI"
class="com.topsoft.bookmanage.web.action.ManagerIndexActionUI">
<result>/admin/index.jsp</result>
</action>
。。。。。。
</package>
=================================================
通过使用拦截器+过滤器可以完美解决权限验证的问题。