Struts2的登录和权限控制用到的是拦截器,需要在struts.xml中配置,每个action都默认的继承defaultStack,如果你用了别的拦截器,还需要手动引入defaultStack。因为登录和访问权限拦截是全局的,拦截返回的结果有些也是全局的。
<packagename="struts-my"extends="struts-default">
<interceptors>
<!--判断是否登录和是否有访问权限 -->
<interceptorname="auth" class="athenticationInterceptor"/>
<interceptor-stackname="myStack">
<interceptor-refname="auth"></interceptor-ref>
<interceptor-refname="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-refname="myStack"></default-interceptor-ref>
<!-- 全局结果-->
<global-results>
<!--拦截没登录返回结果 -->
<resultname="noLogin"type="redirect">/jsp/no_login.jsp</result>
<!--拦截没有权限返回结果 -->
<resultname="noPower"type="redirect">/jsp/no_power.jsp</result>
</global-results>
</package>
<package name="default"extends="struts-my">
<!--登录登出不需要拦截让它们已入 defaultStack-->
<actionname="login" class="loginAction"method="login">
<resultname="input">/jsp/login.jsp</result>
<resultname="success"type="redirect">/jsp/index.jsp</result>
<interceptor-refname="defaultStack"></interceptor-ref>
</action>
<actionname="logout" class="loginAction"method="logout">
<resultname="success">/jsp/login.jsp</result>
<interceptor-refname="defaultStack"></interceptor-ref>
</action>
。。。。。。。。。
需要说明的是,登录和登出是不需要拦截的(或者其它不需要拦截的),我们让它们的拦截器继承defaultStack。局部权限高于全局定义的,它们的拦截器栈就是默认的,不是自定义的。
在登陆成功后,我把“user”放到了session中,我还有一张权限表,里面存的是权限组id和访问的权限。用户表里存放权限组id,这样就可以知道用户有什么权限了。我实现拦截的类是这样写的。
public class AuthenticationInterceptor extendsAbstractInterceptor {
//这个是需要用到的自定义的方法。
private GroupPowerService groupPowerService;
public String intercept(ActionInvocation invocation) throwsException {
Map map=invocation.getInvocationContext().getSession();
if(map.get("user")==null)
{
return "noLogin";
}
else
{
//得到用户的权限id和 访问的类名
intid = ((User)map.get("user")).getGroupId();
//拦截的action的名字
Stringaction =invocation.getInvocationContext().getName();
//通过用户id和拦截的action名判断用户是否有这个权限
if(this.groupPowerService.hasPower(id,action))
//继续执行不拦截
returninvocation.invoke();
return"noPower";
}
}
public GroupPowerService getGroupPowerService() {
returngroupPowerService;
}