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

通过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>
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics