利用Struts2的拦截器进行权限控制
1.在struts.xml中配置一个默认的拦截器,用于权限拦截。具体代码如下:
??????? <interceptors>???
????????? <interceptor name="authority" class="en.estar.utils.AuthorityInterceptor"/>????
????????? <interceptor-stack name="authorityStack">???
??????????? <interceptor-ref name="authority"></interceptor-ref>???
??????????? <interceptor-ref name="defaultStack"></interceptor-ref>???
????????? </interceptor-stack>???
??????? </interceptors>???
??<default-interceptor-ref name="authorityStack"></default-interceptor-ref>? <!-- 配置默认权限拦截器 -->
2.上述配置中有一个拦截器的实现类AuthorityInterceptor,该类继承了AbstractInterceptor类,并且需要实现该类的一个方法public String intercept(ActionInvocation ai) throws Exception。具体代码如下:
??public String intercept(ActionInvocation ai) throws Exception {
??ActionContext context = ai.getInvocationContext();
??String actionName = ai.getProxy().getActionName();
??if(!"login".equals(actionName)){
???Map map = context.getSession();
???String username = (String)map.get("username");//获得session范围的用户名
???if(username==null||"".equals(username)){
????context.put("loginmessage", "对不起,您还没有登录!");
????return Action.LOGIN;//如果用户名为空,则跳回到登陆页面
???}else{
????return ai.invoke();
???}
??}else{//如果用户斤进行登录操作则放行
???return ai.invoke();
??}
?}
?当访问除login以外的任何一个action的时候,该拦截器方法就会生效,从session中获得用户名,如果为空,则表示用户
还没有登录就想访问这个action,这种情况下当然是不允许的,所以拦截器会强制让应用跳回到login.jsp页面。其中Action.LOGIN。对应了一个视图,该视图是一个global视图,
? <global-results><!-- 全局跳转,用于权限验证失败时的跳转目的地 -->
???? <result name="login">/login.jsp</result>
??</global-results>
?
?这样就完成了权限的拦截。
?