`
wmj2003
  • 浏览: 99728 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

通过struts2拦截器实现权限管理

阅读更多
  1. packagecom.work.qxgl.login;
  2. importjava.util.List;
  3. importjava.util.Map;
  4. importjavax.servlet.http.HttpServletRequest;
  5. importorg.apache.commons.logging.Log;
  6. importorg.apache.commons.logging.LogFactory;
  7. importorg.apache.struts2.StrutsConstants;
  8. importorg.apache.struts2.config.DefaultSettings;
  9. importcom.opensymphony.xwork2.Action;
  10. importcom.opensymphony.xwork2.ActionInvocation;
  11. importcom.opensymphony.xwork2.interceptor.AbstractInterceptor;
  12. importcom.work.core.QxglConstants;
  13. importcom.work.core.spring.MyBeanUtil;
  14. importcom.work.qxgl.model.QxglRole;
  15. importcom.work.qxgl.usermodel.UserModelServiceDao;
  16. publicclassAuthorizationInterceptorextendsAbstractInterceptor{
  17. /**
  18. *
  19. */
  20. privatestaticfinallongserialVersionUID=4949812834762901805L;
  21. privatestaticLoglog=LogFactory.getLog(AuthorizationInterceptor.class);
  22. @Override
  23. publicStringintercept(ActionInvocationinvocation)throwsException{
  24. //取得请求的Action名
  25. Stringname=invocation.getInvocationContext().getName();//action
  26. //的名称,在xml中配置的
  27. Stringnamespace=invocation.getProxy().getNamespace();//获取到namespace,还能够获取到要执行的方法,class等
  28. if((namespace!=null)&&(namespace.trim().length()>0)){
  29. if("/".equals(namespace.trim())){
  30. //说明是根路径,不需要再增加反斜杠了。
  31. }else{
  32. namespace+="/";
  33. }
  34. }
  35. StringURL=namespace+invocation.getProxy().getActionName();
  36. URL+=".action";
  37. log.debug("actionname="+name+"||fullActionName="+URL);
  38. if(name.equals("login")||name.equals("loginAccess")){
  39. //如果用户想登录,则使之通过
  40. returninvocation.invoke();
  41. }
  42. Mapsession=invocation.getInvocationContext().getSession();
  43. //TODO在这里判断用户是否已经登陆,更改此方法,和OnLineUserManager联系起来,
  44. //OnLineUserManager是线程安全的,效率上可能会比较低!所以暂时还不更改!。
  45. Stringsuccess=(String)session.get(QxglConstants.AUTH_SUCCESS);
  46. log.debug("success="+success);
  47. //如果没有登陆,那么就退出系统
  48. if(success==null||!"true".equals(success)){
  49. log.debug("pleaselogin");
  50. returnAction.LOGIN;
  51. }
  52. Stringuserid=(String)session.get("userid");
  53. if(userid==null||"".equals(userid)){
  54. log.error("用户id不能为空!");
  55. returnAction.LOGIN;
  56. }
  57. //如果是超级管理员,那么直接返回
  58. if("admin1111222233334444555566admin".equals(userid)){
  59. returninvocation.invoke();
  60. }
  61. UserModelServiceDaouserModelServiceDao=(UserModelServiceDao)MyBeanUtil
  62. .getBean("userModelServiceDao");
  63. //获取当前用户所拥有的角色
  64. List<QxglRole>userRoles=userModelServiceDao.getRoles(userid);
  65. if(userRoles==null||userRoles.size()<1){
  66. //没有任何角色
  67. log.warn("此用户"+userid+"没有任何角色,没有权限执行任何功能");
  68. return"noPermit";
  69. }
  70. List<QxglRole>urlRoles=userModelServiceDao.getRolesByUrl(URL);
  71. //如果此URL没有赋给任何角色,说明是合法用户就可以访问
  72. if(urlRoles==null||urlRoles.size()<1){
  73. log.debug("此资源未赋给任何角色,合法用户就可以访问");
  74. returninvocation.invoke();
  75. }
  76. //根据角色来判断用户是否有权限来使用当前的URL(action)
  77. booleanflag=false;//如果有权限访问设置为true;
  78. intuserLen=userRoles.size();
  79. inturlLen=urlRoles.size();
  80. QxglRoletempUserRole=null;
  81. QxglRoletempUrlRole=null;
  82. START:
  83. for(inti=0;i<userLen;i++){
  84. //首先初始化
  85. tempUserRole=null;
  86. tempUrlRole=null;
  87. tempUserRole=userRoles.get(i);
  88. for(intj=0;j<urlLen;j++){
  89. tempUrlRole=urlRoles.get(j);
  90. if(tempUserRole.getId().equals(tempUrlRole.getId())){
  91. flag=true;
  92. breakSTART;
  93. }
  94. }
  95. }
  96. if(flag){
  97. log.debug("successauth");
  98. returninvocation.invoke();
  99. }else{
  100. //用户如果在主页面中输入其他的任何链接,系统将自动执行logout动作,因为在/sysmenu/top.jsp中配置了onunload事件。
  101. log.warn("此用户"+userid+"没有权限执行此功能"+URL);
  102. return"noPermit";
  103. }
  104. }
  105. }

在struts2的配置文件中配置

  1. <packagename="qxglmain"extends="struts-default"namespace="/">
  2. <!--自定义拦截器-->
  3. <interceptors>
  4. <interceptorname="auth"
  5. class="com.work.qxgl.login.AuthorizationInterceptor"/>
  6. <interceptorname="ourLogger"
  7. class="com.work.core.interceptor.LoggingInterceptor"/>
  8. <interceptorname="ourTimer"
  9. class="com.work.core.interceptor.TimerInterceptor"/>
  10. <!--自定义拦截器堆栈-->
  11. <interceptor-stackname="qxglStack">
  12. <interceptor-refname="auth"/><!--权限控制 -->
  13. <!--用来查看每个action执行了多长时间,看执行效率,只所以重新编写,因为xwork的源代码的日志级别低为INFO,我们配置的日志级别为ERROR。所以看不到了-->
  14. <interceptor-refname="ourTimer"/>
  15. <interceptor-refname="ourLogger"/>
  16. <!--
  17. <interceptor-refname="logger"/>-->
  18. <!--引用默认的拦截器堆栈-->
  19. <interceptor-refname="defaultStack"/>
  20. </interceptor-stack>
  21. </interceptors>
  22. <!--重定义默认拦截器堆栈-->
  23. <default-interceptor-refname="qxglStack"/>
  24. <global-results>
  25. <resultname="login"type="redirectAction">login</result>
  26. <resultname="error">/qxgl/error.jsp</result>
  27. <resultname="noPermit">/qxgl/noPermit.jsp</result>
  28. <resultname="input"type="redirectAction">login</result>
  29. </global-results>
  30. <!--exception的配置必须在global-results后面-->
  31. <global-exception-mappings>
  32. <exception-mapping
  33. exception="java.lang.NullPointerException"result="error"/>
  34. <exception-mappingexception="java.lang.Exception"
  35. result="error"/>
  36. <exception-mapping
  37. exception="com.work.core.exception.StorageException"result="error"/>
  38. </global-exception-mappings>
  39. <actionname="qxglmain"
  40. class="com.work.qxgl.main.QxglMainAction">
  41. <result>/qxgl/menutree/qxglmain.jsp</result>
  42. </action>
  43. <actionname="sysmain"
  44. class="com.work.qxgl.main.QxglMainAction"method="sysmain">
  45. <result>/sysmenu/sysMain.jsp</result>
  46. </action>
  47. <actionname="login"class="com.work.qxgl.login.LoginAction"
  48. method="login">
  49. <result>/login.jsp</result>
  50. </action>
  51. <actionname="logout"class="com.work.qxgl.login.LogoutAction">
  52. <result>/login.jsp</result>
  53. </action>
  54. <actionname="loginAccess"class="com.work.qxgl.login.LoginAction">
  55. <resulttype="redirectAction">sysmain</result>
  56. <resultname="input">/login.jsp</result>
  57. </action>
  58. <actionname="listOnLineUsers"class="com.work.qxgl.login.OnLineUserAction">
  59. <result>/qxgl/onlineuser/onlineuser.jsp</result>
  60. </action>
  61. <actionname="kickUser"class="com.work.qxgl.login.OnLineUserAction"
  62. method="kickUser">
  63. <resulttype="chain">listOnLineUsers</result>
  64. </action>
  65. <actionname="listMenu"class="com.work.qxgl.main.QxglMainAction"
  66. method="listMenu">
  67. <result>/sysmenu/menu.jsp</result>
  68. </action>
  69. </package>

缺点:

struts2的拦截器只能够控制*.action,其他的jsp文件等会被忽略,所以通过struts2的拦截器实现权限控制有一定的缺陷。

我们可以通过编写一个filter来控制其他请求的权限

  1. packagecom.work.core.filter;
  2. /**
  3. *@authorwangmingjie
  4. *@date2008-8-25下午10:09:26
  5. */
  6. importjava.io.IOException;
  7. importjavax.servlet.Filter;
  8. importjavax.servlet.FilterChain;
  9. importjavax.servlet.FilterConfig;
  10. importjavax.servlet.ServletException;
  11. importjavax.servlet.ServletRequest;
  12. importjavax.servlet.ServletResponse;
  13. importjavax.servlet.http.HttpServletRequest;
  14. importjavax.servlet.http.HttpServletResponse;
  15. importjavax.servlet.http.HttpSession;
  16. importorg.apache.commons.logging.Log;
  17. importorg.apache.commons.logging.LogFactory;
  18. importcom.work.core.QxglConstants;
  19. publicclassAuthFilterimplementsFilter{
  20. privatestaticLoglog=LogFactory.getLog(AuthFilter.class);
  21. publicvoidinit(FilterConfigfilterConfig)throwsServletException{
  22. if(log.isDebugEnabled()){
  23. log.debug("初始化权限过滤器。");
  24. }
  25. }
  26. publicvoiddoFilter(ServletRequestservletRequest,
  27. ServletResponseservletResponse,FilterChainfilterChain)
  28. throwsIOException,ServletException{
  29. /**
  30. *1,doFilter方法的第一个参数为ServletRequest对象。此对象给过滤器提供了对进入的信息(包括
  31. *表单数据、cookie和HTTP请求头)的完全访问。第二个参数为ServletResponse,通常在简单的过
  32. *滤器中忽略此参数。最后一个参数为FilterChain,此参数用来调用servlet或JSP页。
  33. */
  34. HttpServletRequestrequest=(HttpServletRequest)servletRequest;
  35. /**
  36. *如果处理HTTP请求,并且需要访问诸如getHeader或getCookies等在ServletRequest中
  37. *无法得到的方法,就要把此request对象构造成HttpServletRequest
  38. */
  39. HttpServletResponseresponse=(HttpServletResponse)servletResponse;
  40. StringcurrentURL=request.getRequestURI();//取得根目录所对应的绝对路径:
  41. HttpSessionsession=request.getSession(false);
  42. //如果jsp就验证(login.jsp除外)
  43. if(currentURL.indexOf(QxglConstants.LOGIN_PAGE)==-1&&currentURL.indexOf(".jsp")>-1){
  44. if(log.isDebugEnabled()){
  45. log.debug("对jsp文件进行权限验证。"+"请求的URL:"+currentURL);
  46. }
  47. //判断当前页是否是重定向以后的登录页面页面,如果是就不做session的判断,防止出现死循环
  48. if(session==null||session.getAttribute(QxglConstants.AUTH_SUCCESS)==null){
  49. response.sendRedirect(request.getContextPath()+QxglConstants.LOGIN_PAGE);
  50. return;
  51. }
  52. }
  53. //加入filter链继续向下执行
  54. filterChain.doFilter(request,response);
  55. /**
  56. *调用FilterChain对象的doFilter方法。Filter接口的doFilter方法取一个FilterChain对象作为它
  57. *的一个参数。在调用此对象的doFilter方法时,激活下一个相关的过滤器。如果没有另
  58. *一个过滤器与servlet或JSP页面关联,则servlet或JSP页面被激活。
  59. */
  60. }
  61. publicvoiddestroy(){
  62. }
  63. }

在web.xml中配置权限过滤器

  1. <!--进行权限验证-->
  2. <filter>
  3. <filter-name>AuthFilter</filter-name>
  4. <filter-class>
  5. com.work.core.filter.AuthFilter
  6. </filter-class>
  7. </filter>
  8. <filter-mapping>
  9. <filter-name>AuthFilter</filter-name>
  10. <url-pattern>/*</url-pattern>
  11. </filter-mapping>
分享到:
评论

相关推荐

    Struts2拦截器实现权限控制demo

    在这个“Struts2拦截器实现权限控制demo”中,我们将深入探讨如何利用拦截器来实现细粒度的用户权限管理。 首先,我们需要了解Struts2中的拦截器工作原理。拦截器是基于Java的动态代理模式实现的,它们按照配置的...

    struts2拦截器实现权限控制

    这篇博客文章“struts2拦截器实现权限控制”深入探讨了如何利用Struts2的拦截机制来执行用户访问权限的验证。 在Struts2中,拦截器是基于AOP(面向切面编程)的概念设计的,它们在Action调用前后执行,可以添加额外...

    Struts2拦截器及其用法详细说明

    Struts2是一个强大的Java web开发框架,它提供了一种组织和控制MVC(模型-视图-控制器)架构的方式...通过自定义拦截器和合理配置,我们可以实现诸如日志记录、事务管理、权限验证等多种业务需求,大大提升了开发效率。

    使用struts2拦截器对登陆权限验证

    在本案例中,我们将深入探讨如何使用Struts2拦截器实现登录权限验证,同时结合Servlet Filter进一步加强安全性。 首先,让我们理解Struts2拦截器的工作原理。拦截器是基于AOP(面向切面编程)的概念设计的,它们...

    struts2 用拦截器 实现用户权限登录

    Struts2是一个强大的Java web应用程序框架,它提供了一种组织和控制MVC(Model-...通过这种方式,Struts2的拦截器为我们提供了灵活的权限控制机制,使得我们能够轻松地管理和维护用户的登录状态,保证了应用的安全性。

    struts2拦截器实现拦截不文明字迹

    拦截器是Struts2框架的一个重要组成部分,能够帮助开发者实现一些在请求处理前后执行的通用逻辑,如日志记录、权限验证、数据校验等。在本场景中,我们将探讨如何使用Struts2拦截器来实现对不文明字迹或者敏感词汇的...

    struts2 拦截器

    拦截器在Struts2中扮演着至关重要的角色,它们是AOP(面向切面编程)的一个实现,用于在Action执行前后插入额外的功能。下面将详细探讨Struts2拦截器及其工作原理。 ### 一、Struts2 拦截器概念 1. **拦截器是什么...

    struts2 拦截器实现登录控制

    这篇博客“struts2 拦截器实现登录控制”显然会探讨如何利用拦截器来实现用户登录验证,从而保护应用程序的受保护资源。 首先,我们了解下Struts2拦截器的工作原理。拦截器是基于AOP(面向切面编程)的概念,它位于...

    struts2 拦截器实例

    在Struts2中,拦截器(Interceptor)扮演着核心角色,它们允许开发者在Action执行前后插入自定义的逻辑,如日志、权限检查、事务管理等。现在我们将深入探讨Struts2的拦截器机制及其实例应用。 ### 一、Struts2拦截...

    struts2拦截器

    标题“struts2拦截器”指的是Struts2框架中的拦截器机制,这是一个关键的组件,可以让我们在不修改实际业务代码的情况下,实现对请求处理流程的扩展和定制。 描述中提到的“基于struts2的拦截器测试,实现了页面的...

    运用struts2技术的拦截器实现的页面检测和用户注册

    通过上述方式,我们可以利用Struts2的拦截器机制有效地实现页面访问控制和用户注册功能,同时保持代码的清晰和模块化。在实际开发中,还可以结合其他拦截器,如性能监控、日志记录、事务管理等,进一步增强应用的...

    Struts2 拦截器

    拦截器是Struts2框架的核心特性之一,它们扮演着处理请求、增强功能和实现业务逻辑的角色。在Struts2中,拦截器就像过滤器一样工作,通过链式调用在动作执行前后进行预处理和后处理。 首先,我们来理解一下拦截器的...

    Struts2拦截器源程序

    Struts2是一个非常流行的Java Web框架,用于构建和维护可扩展且易于管理的企业级应用程序。...通过对`98struts201`文件的深入研究,我们可以更好地掌握Struts2拦截器的实现细节,从而提高开发效率和应用质量。

    struts2拦截器实现用户登录权限的验证

    Struts2框架提供了一种灵活的方式来实现这一功能:通过自定义拦截器来控制用户的访问权限。下面我们将详细介绍如何利用Struts2的拦截器来实现用户登录权限的验证。 #### 概念理解 - **拦截器(Interceptor)**:在...

    struts 拦截器实现权限拦截

    拦截器是Struts2框架中的一个重要组成部分,它们在Action调用前后执行,可以用于实现各种功能,如日志、事务管理以及我们的重点——权限拦截。 权限拦截是Web应用安全机制的重要一环,它确保只有具备特定权限的用户...

    struts2拦截器应用小例子

    通过这个例子,你可以学习到如何创建、注册拦截器,以及如何在Struts2框架中构建拦截器栈,从而更灵活地管理应用程序的行为。 总结来说,Struts2的拦截器机制提供了强大的功能,允许开发者以声明式的方式控制请求的...

    Struts2拦截器原理分析

    在文章"Struts2拦截器原理分析实例"中,作者通过一个具体的应用场景,展示了如何配置和使用拦截器来实现特定的功能,比如日志记录或权限验证。通过阅读这篇博客,我们可以更直观地理解拦截器的工作方式和价值。 ...

    Struts2拦截器源码

    在实际开发中,我们可以通过扩展Struts2的拦截器实现自定义功能。例如,你可以创建一个新的拦截器来实现登录检查、权限控制或性能监控,然后将其添加到拦截器栈中。通过理解和研究Struts2的拦截器源码,我们可以更好...

    struts2拦截器国际化

    通过这种方式,我们可以在不修改Action代码的情况下,利用Struts2拦截器实现国际化策略的动态调整,从而提供更灵活的多语言支持。 总的来说,Struts2拦截器和国际化是两个关键特性,它们分别提供了控制流管理和多...

    Struts2学习案例(拦截器)

    在Struts2中,拦截器是基于Java的动态AOP(面向切面编程)实现的,它可以在Action调用前后插入额外的逻辑,比如日志记录、权限验证、事务管理等。拦截器通过配置文件或者注解与Action关联,形成一个拦截器栈,每个...

Global site tag (gtag.js) - Google Analytics