2012-07-17 70 views
0

在我当前的struts2 + spring web应用程序中,我有自定义的userSessionInterceptor,它运行良好。我现在也想开始执行用户角色。我做了许多在线研究,看起来有很多方法可以做到,例如例外,sendRedirectstruts2检查权限拦截器

什么是最正确的方法来做到这一点?我已经将用户角色保存在用户会话中,并且在检测并发现错误时没有问题。我唯一需要决定的是如何在权限不正确时对其做出反应。

在拦截器中,我知道我可以返回“xxx”并进入“xxx”动作。但是,我想要实现的是,当用户尝试执行没有权限的操作时,会显示一条消息。我假设我可以返回到前一页并向url添加一个参数。

对此有任何提示?

谢谢

+0

没有 “最正确” 的方式做到这一点;这取决于你的需求。存储请求很容易,显示一条消息取决于您实际上想要如何处理它。重定向到“拒绝访问”页面是最简单的。 – 2012-07-17 22:36:04

+0

谢谢。确切地说,使用权限错误url参数将其重定向回上一页的最佳方式是什么? – AbSoLution8 2012-07-18 01:50:06

+0

如果您的应用程序允许使用任何安全API,我强烈建议您选择Spring安全性还是Apache Shrio,这两个框架都会满足您所有的要求 – 2012-07-18 04:42:49

回答

0

这里是一个示例程序。

RoleInterceptor.java

package com.sample.common.interceptor; 

import javax.servlet.http.HttpSession; 

import org.apache.struts2.ServletActionContext; 

import com.opensymphony.xwork2.ActionContext; 
import com.opensymphony.xwork2.ActionInvocation; 
import com.opensymphony.xwork2.interceptor.Interceptor; 
import com.opensymphony.xwork2.util.ValueStack; 

public class RoleInterceptor implements Interceptor { 

    private static final long serialVersionUID = 5031826078189685536L; 

    @Override 
    public void init() { 

    } 

    @Override 
    public void destroy() { 

    } 

    @Override 
    public String intercept(ActionInvocation actionInvocation) { 

     String result = null; 
     try { 
      ActionContext actionContext = actionInvocation 
        .getInvocationContext(); 

      ValueStack vStack = actionContext.getValueStack(); 
      HttpSession httpSession = ServletActionContext.getRequest() 
        .getSession(); 

      StringBuilder actionUrl = new StringBuilder(actionInvocation 
        .getProxy().getNamespace()); 
      actionUrl.append("/"); 
      actionUrl.append(actionInvocation.getProxy().getActionName()); 

      if (httpSession != null) { 

       boolean hasPermission = true; // if the role has the permission 

       if (hasPermission) { 

        result = actionInvocation.invoke(); 

       } else { 

        vStack.set("userMsg", 
          "You are not authorized to access this link"); 
        result = "user.unauthorized"; 
       } 
      } else { 

       vStack.set("userMsg", "Please login to your account"); 
       result = "user.login"; 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return result; 

    } 

} 

struts.xml的

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE struts PUBLIC 
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
"http://struts.apache.org/dtds/struts-2.0.dtd"> 
<struts> 
    <package name="userRoleInterceptor"> 
     <interceptors> 
      <interceptor name="userRole" 
       class="com.sample.common.interceptor.RoleInterceptor" /> 
     </interceptors> 
    </package> 
    <package name="user" namespace="/user" extends="struts-default, json-default, userRoleInterceptor"> 
     <action name="user_details" method="getUserDetails" 
      class="com.sample.user.web.action.User"> 
      <interceptor-ref name="userRole"/> 
      <interceptor-ref name="store"> 
       <param name="operationMode">RETRIEVE</param> 
      </interceptor-ref> 
      <result name="success">userDetails.jsp</result> 
      <result name="input">/common/error.jsp</result> 
      <result name="busy" type="redirectAction" >/common/busy.jsp</result> 
      <result name="error" type="redirectAction" >/common/test.jsp</result> 
      <result name="user.login" type="redirectAction" >/common/login.jsp</result> 
      <result name="user.unauthorized" type="redirectAction" >/common/unauthorizedUser.jsp</result> 
     </action> 
    </package> 
</struts>