在使用struts2框架开发一个办公OA系统时候,需要使用到权限控制
除了判定是否登陆之外,还必须对每个action的访问实现权限控制,因为如果用户登陆成功了,而且以前拥有某个权限的访问,记录下访问的action,而现在没有权限了,也能直接在地址栏输入action路径直接访问,这将使权限这一模块毫无用处。
因为没有用到命名空间,这里对于涉及命名空间的没有控制
解决思路:【先看这个,懂了以下代码就明白了】
我们知道struts2的拦截器可以很方便实现对action的访问拦截,先行判断然后再决定是否能够访问。我的实现方法是:
1.左侧菜单的树形每一列对应一个子模块,也对应一个权限控制ID,若是用户拥有权限,显示,没有,不显示
2.配置一个xml文件,包含所有权限ID以及其对应的子模块的action,由于某些模块可能使用相同的action,将存在同名的action配置【待会实现注意】
3.定义一个servlet,在web.xml中配置其启动优先,服务器启动加载
4.在servlet中,启动是使用插件读入xml文件内容,转化为一个hashmap,键值为action的name属性,value为对应权限id的组合字符串,以空格隔开
5.hashmap放入application
6.在struts.xml中定义拦截器的package,定义一个拦截器,配置拦截器栈,其他需要使用到拦截器的package在配置是使用extends这个拦截器package
7.用户登陆后从数据库查询权限,转为一个hashmap,权限id为键值【为了查询方便】,放入session
8.实现拦截器,从session中取用户权限,从application中取action映射权限ID的map,从拦截器的invocation中取此次访问的action在配置文件中的actionName
先判定是否登陆,否,转login.jsp
是,判定用户是否有访问此action的权限,否,跳到消息页,是,通过
实现步骤:
1.关于左侧菜单的显示,是标签和js等的内容,不再解释,这里主要是地址栏非法访问的控制
2.配置xml文件 authority.xml,配置对应的权限id和其可使用的action【name属性为在struts.xml中配置action的name属性】
[xhtml] view plaincopyprint? <?xml version="1.0" encoding="UTF-8"?> <total> <!-- //卷库管理--> <authority id="18"> <action name="addRecord"/> <action name="deleteRecord"/> <action name="updateRecord"/> <action name="getAllRecordList"/> <action name="getRecordContent"/> </authority> </total>
3.定义servlet,启动加载配置
web.xml中
[xhtml] view plaincopyprint?
<servlet>
<servlet-name>InitBuild</servlet-name>
<servlet-class>interceptor.InitBuild</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
对应servlet【省略package import等】
[java] view plaincopyprint? public class InitBuild extends HttpServlet { public void init() throws ServletException { try { String path = this.getServletContext().getRealPath("/");//项目路径 this.getServletContext().setAttribute("path", path); this.getServletContext().setAttribute("msg", "启动加载完毕"); //xml文件路径 String xmlPath = path+"WEB-INF/authority.xml"; this.getServletContext().setAttribute("xmlpath", xmlPath); //调用方法,读入xml文件,转化为hashmap this.getServletContext().setAttribute("authorityMap", InitXmlAuthorInfo.getAuthorityMap(xmlPath)); } catch (Exception e) { e.printStackTrace(); } }}
4.在3中调用的方法,主要读入xml文件,转为hashmap,这里是用dom4j
[java] view plaincopyprint?
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class InitXmlAuthorInfo {
private static Document getDom(String xmlPath) {
try {
SAXReader reader = new SAXReader();
Document document = null;
document = reader.read(new File(xmlPath));
return document;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static HashMap<String,String> getAuthorityMap(String xmlPath)
{
HashMap<String,String> authorityMap = new HashMap<String,String>();
Document document = getDom(xmlPath);
Element rootElm = document.getRootElement();
for (Iterator i = rootElm.elementIterator(); i.hasNext();) {
Element element = (Element) i.next();
String id = element.attributeValue("id");
List<Element> temp = element.elements();
for (int j = 0,length = temp.size();j<length; j++) {
String actionName = temp.get(j).attribute("name").getText();
//action是否重名
if(authorityMap.containsKey(actionName))
{
authorityMap.put(actionName,authorityMap.get(actionName)+" "+id);
}else{
authorityMap.put(actionName,id);
}
}
}
return authorityMap;
}
}
5.配置拦截器和拦截器栈 struts.xml中配置
[xhtml] view plaincopyprint? <!-- 其他package必须extends此package --> <package name="authorityCheck" extends="struts-default"> <interceptors> <!-- 在package中配置 注意,login不需要定义此拦截器,定义权限控制拦截器 --> <interceptor name="authority" class="interceptor.AuthorizationInterceptor"/> <!-- 定义含“权限检查拦截器”的拦截器栈,注意缺省的拦截器栈“defaultStack”要放在前面 --> <interceptor-stack name="authorityStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="authority"></interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="authorityStack"></default-interceptor-ref> <!-- 定义全局处理结果 未登录转到此页--> <global-results> <!-- 逻辑名为login的结果,映射到/login.jsp页面 --> <result name="login">/login.jsp</result> <!-- 无权限进行操作 --> <result name="authorityDeny">/authorityMsg.jsp</result> </global-results> </package>
6.实现拦截器
[java] view plaincopyprint? package interceptor; import java.util.Iterator; import java.util.Map; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class AuthorizationInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception { // 获取session 以及application Map session = invocation.getInvocationContext().getSession(); //判定是否登陆了 未登录 打回登陆页面 用户登陆成功必须将UserID放入session if(session.get("UserID") == null) { System.out.println("AUTHOR ERROR:未登录"); return Action.LOGIN; } Map application = invocation.getInvocationContext().getApplication(); //获取全局的权限列表 这个是前面服务器启动加载servlet时候放入application的 Map globalAuthorityMap = (Map)application.get("authorityMap"); //1.判不为空 //2.从session取用户权限列表 //3.取action的name //4.根绝action的name取权限字符串 //5.切分,校验,某一个有就发,全部没有转发消息页面 //获取用户的权限列表 用户登陆成功将其拥有所有权限的id放入hashmap键值,整个放入session Map userAuthorityMap = (Map)session.get("AuthMap"); //获取请求的action的name String actionName = invocation.getProxy().getActionName(); String authorStr = (String)globalAuthorityMap.get(actionName); //切分,当初对于不同权限访问同一action配置空格隔开的字符串 String[] authorList = authorStr.split(" "); for (int i = 0; i < authorList.length; i++) { if(userAuthorityMap.containsKey(authorList[i])) { return invocation.invoke(); } } session.put("authorityMag", "对不起,您没有权限进行此操作"); return "authorityDeny"; } }
7.其他package的配置
注,登陆注销的action不需要
[xhtml] view plaincopyprint? <package name="record" extends="authorityCheck"> <action name="getRecordContent" class="com.oa.team4.action.RecordAction" method="getRecordContent"> <result name="success">/record/edit_record.jsp</result> </action> </package>
相关推荐
在这个“Struts2拦截器实现权限控制demo”中,我们将深入探讨如何利用拦截器来实现细粒度的用户权限管理。 首先,我们需要了解Struts2中的拦截器工作原理。拦截器是基于Java的动态代理模式实现的,它们按照配置的...
Struts2是一个非常流行的Java Web框架,用于...通过学习这个文档,开发者可以了解到如何在实际项目中灵活运用Struts2的拦截器来实现高效且健壮的权限控制系统。这种能力对提升应用的安全性和用户体验有着显著的贡献。
这篇博客“struts2 拦截器实现登录控制”显然会探讨如何利用拦截器来实现用户登录验证,从而保护应用程序的受保护资源。 首先,我们了解下Struts2拦截器的工作原理。拦截器是基于AOP(面向切面编程)的概念,它位于...
在实际项目中,我们通常会结合Spring Security等安全框架,通过拦截器实现更复杂的权限控制。 总结,Struts2拦截器是其核心机制之一,它允许开发者以模块化的方式添加额外的功能,提高代码的可复用性和可维护性。...
在Struts2中,拦截器是实现业务逻辑和控制流程之间解耦的关键组件。本教程将详细介绍如何使用Struts2的拦截器来实现用户权限登录功能。 ### 一、拦截器的原理与作用 1. **原理**:拦截器工作在Action调用之前,它...
综上所述,通过Struts2的拦截器,我们可以实现高效且可扩展的权限控制系统。在`Struts2_Authority`压缩包文件中,可能包含了实现上述功能的示例代码,包括自定义拦截器的实现、配置文件以及相关的Action和视图文件,...
在本案例中,我们将深入探讨如何使用Struts2拦截器实现登录权限验证,同时结合Servlet Filter进一步加强安全性。 首先,让我们理解Struts2拦截器的工作原理。拦截器是基于AOP(面向切面编程)的概念设计的,它们...
拦截器是Struts2框架的一个重要组成部分,能够帮助开发者实现一些在请求处理前后执行的通用逻辑,如日志记录、权限验证、数据校验等。在本场景中,我们将探讨如何使用Struts2拦截器来实现对不文明字迹或者敏感词汇的...
拦截器在Struts2中扮演着至关重要的角色,它们是AOP(面向切面编程)的一个实现,用于在Action执行前后插入额外的功能。下面将详细探讨Struts2拦截器及其工作原理。 ### 一、Struts2 拦截器概念 1. **拦截器是什么...
在Struts2中,拦截器(Interceptor)扮演着核心角色,它们允许开发者在Action执行前后插入自定义的逻辑,如日志、权限检查、事务管理等。现在我们将深入探讨Struts2的拦截器机制及其实例应用。 ### 一、Struts2拦截...
描述中提到的“基于struts2的拦截器测试,实现了页面的跳转,中间过程的拦截”,这表明我们可能在创建一个测试场景,来验证拦截器如何控制请求的流向以及如何在特定的业务逻辑点进行干预。页面跳转通常是拦截器完成...
在Struts2中,拦截器(Interceptor)是实现业务逻辑控制和增强功能的重要组件,尤其是在权限控制方面。本文将深入探讨Struts2拦截器如何帮助我们实现精细的权限控制,并通过实际例子进行说明。 首先,理解Struts2...
通过上述方式,我们可以利用Struts2的拦截器机制有效地实现页面访问控制和用户注册功能,同时保持代码的清晰和模块化。在实际开发中,还可以结合其他拦截器,如性能监控、日志记录、事务管理等,进一步增强应用的...
拦截器是Struts2框架的核心特性之一,它们扮演着处理请求、增强功能和实现业务逻辑的角色。在Struts2中,拦截器就像过滤器一样工作,通过链式调用在动作执行前后进行预处理和后处理。 首先,我们来理解一下拦截器的...
Struts2框架提供了一种灵活的方式来实现这一功能:通过自定义拦截器来控制用户的访问权限。下面我们将详细介绍如何利用Struts2的拦截器来实现用户登录权限的验证。 #### 概念理解 - **拦截器(Interceptor)**:在...
在Struts2中,拦截器(Interceptor)扮演着核心角色,它们允许开发者在动作执行前后插入自定义的逻辑,如日志、权限检查、数据验证等。本示例将探讨如何在Struts2中使用拦截器。 首先,我们需要理解Struts2拦截器的...
总结来说,Struts2拦截器是框架的核心部分,它们提供了一种灵活的方式,以实现各种功能,如日志记录、性能监控、权限控制等,同时保持代码的整洁和模块化。通过对`98struts201`文件的深入研究,我们可以更好地掌握...
在文章"Struts2拦截器原理分析实例"中,作者通过一个具体的应用场景,展示了如何配置和使用拦截器来实现特定的功能,比如日志记录或权限验证。通过阅读这篇博客,我们可以更直观地理解拦截器的工作方式和价值。 ...