Struts2拦截器 实现未登录拦截和权限控制



Struts2拦截器 实现未登录拦截和权限控制

 

最近在研究struts,把以前做项目时候用拦截器实现的一些功能回想起来跟大家分享一下:
先创建一个拦截器,实现MethodFilterInterceptor这个抽象类,可以进行方法的限制和包含过滤。
该拦截器实现未登录不能进行访问的功能,可以扩展成对权限进行控制。
package com.struts2.interceptor;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.StrutsStatics;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
public class LoginInterceptor extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
// TODO Auto-generated method stub
ActionContext context = invocation.getInvocationContext();

//通过ActionContext来获取httpRequest
HttpServletRequest request = (HttpServletRequest)context.get(StrutsStatics.HTTP_REQUEST);
//也可以通过ServletActionContext来获取httpRequest
//HttpServletRequest request = ServletActionContext.getRequest();
//取得根目录的绝对路径
String currentURL = request.getRequestURI();
//截取到访问的相对路径,可以通过这个和权限表比较来进行相应的权限控制
String targetURL = currentURL.substring(currentURL.indexOf(“/”, 1), currentURL.length());
System.out.println(currentURL+”…………..”+targetURL);

//通过ActionContext获取session的信息,以Map形式返回
Map session = context.getSession();
//获取容器里面的username值,如果存在说明该用户已经登录,让他执行操作,如果未登录让他进行登录
String username = (String)session.get(“username”);
if(username!=null){
invocation.invoke();
}
context.put(“nologin”, “对不起,你没有登录,不能进行该操作”);
return “login”;

}
}

然后将这个拦截器配置的struts.xml里面:
<!– 配置拦截器 –>
<package name=”my-default” extends=”struts-default”>
<interceptors>
<!– 配置未登录进行操作的拦截器 –>
<interceptor name=”loginInterceptor” class=”com.struts2.interceptor.LoginInterceptor”>
<param name=”param”>测试参数</param>
</interceptor>
<!– 重新封装一个默认的拦截器栈 –>
<interceptor-stack name=”myDefaultStack”>
<interceptor-ref name=”loginInterceptor” />
<interceptor-ref name=”defaultStack” />
</interceptor-stack>
</interceptors>
<!– 为这个包设置默认的拦截器栈 –>
<default-interceptor-ref name=”myDefaultStack” />
<!– 设置全局的返回值 –>
<global-results>
<result name=”login”>/login.jsp</result>
</global-results>
</package>