博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自定义AccessDeniedHandler
阅读量:5360 次
发布时间:2019-06-15

本文共 2700 字,大约阅读时间需要 9 分钟。

在Spring默认的AccessDeniedHandler中只有对页面请求的处理,而没有对Ajax的处理。而在项目开发是Ajax又是我们要常用的技术,所以我们可以通过自定义AccessDeniedHandler来处理Ajax请求。我们在Spring默认的AccessDeniedHandlerImpl上稍作修改就可以了。

 

  1. public class DefaultAccessDeniedHandler implements AccessDeniedHandler {  
  2.   
  3.     /* (non-Javadoc) 
  4.      * @see org.springframework.security.web.access.AccessDeniedHandler#handle(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, org.springframework.security.access.AccessDeniedException) 
  5.      */  
  6.     private String errorPage;  
  7.   
  8.     //~ Methods ========================================================================================================  
  9.   
  10.     public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException)  
  11.             throws IOException, ServletException {  
  12.         boolean isAjax = ControllerTools.isAjaxRequest(request);  
  13.         if(isAjax){  
  14.             Message msg = MessageManager.exception(accessDeniedException);  
  15.             ControllerTools.print(response, msg);  
  16.         }else if (!response.isCommitted()) {  
  17.             if (errorPage != null) {  
  18.                 // Put exception into request scope (perhaps of use to a view)  
  19.                 request.setAttribute(WebAttributes.ACCESS_DENIED_403, accessDeniedException);  
  20.   
  21.                 // Set the 403 status code.  
  22.                 response.setStatus(HttpServletResponse.SC_FORBIDDEN);  
  23.   
  24.                 // forward to error page.  
  25.                 RequestDispatcher dispatcher = request.getRequestDispatcher(errorPage);  
  26.                 dispatcher.forward(request, response);  
  27.             } else {  
  28.                 response.sendError(HttpServletResponse.SC_FORBIDDEN, accessDeniedException.getMessage());  
  29.             }  
  30.         }  
  31.     }  
  32.   
  33.     /** 
  34.      * The error page to use. Must begin with a "/" and is interpreted relative to the current context root. 
  35.      * 
  36.      * @param errorPage the dispatcher path to display 
  37.      * 
  38.      * @throws IllegalArgumentException if the argument doesn't comply with the above limitations 
  39.      */  
  40.     public void setErrorPage(String errorPage) {  
  41.         if ((errorPage != null) && !errorPage.startsWith("/")) {  
  42.             throw new IllegalArgumentException("errorPage must begin with '/'");  
  43.         }  
  44.   
  45.         this.errorPage = errorPage;  
  46.     }  
  47.   
  48. }  

这里我们直接将异常信息通过PrintWriter输出到前台,然后在前台做统一的处理就可以了。在前台对后台消息统一处理的方法可以参考我的这篇文章

 

最后在配置文件中配置下

 

  1. <sec:http auto-config="true" access-decision-manager-ref="accessDecisionManager">  
  2.       
  3.     <sec:access-denied-handler ref="accessDeniedHandler"/>  
  4.       
  5.     <sec:session-management invalid-session-url="/login.jsp" />  
  6.       
  7.     <sec:intercept-url pattern="/app.jsp" access="AUTH_LOGIN"/>  
  8.     <sec:intercept-url pattern="/**" access="AUTH_GG_FBGBGG"/>  
  9.       
  10.     <sec:form-login login-page="/login.jsp" authentication-failure-url="/login.jsp"  
  11.         default-target-url="/index.jsp"/>  
  12.           
  13. </sec:http>  
  14.   
  15. <!-- 自定义权限不足处理程序 -->  
  16. <bean id="accessDeniedHandler" class="com.zrhis.system.security.RequestAccessDeniedHandler">  
  17.     <property name="errorPage" value="/WEB-INF/error/403.jsp"></property>  
  18. </bean>  

 

转载于:https://www.cnblogs.com/yechanglv/p/6941796.html

你可能感兴趣的文章
字母和数字键的键码值(keyCode)
查看>>
IE8调用window.open导出EXCEL文件题目
查看>>
Spring mvc初学
查看>>
VTKMY 3.3 VS 2010 Configuration 配置
查看>>
01_1_准备ibatis环境
查看>>
windows中修改catalina.sh上传到linux执行报错This file is needed to run this program解决
查看>>
JavaScript中的BOM和DOM
查看>>
360浏览器兼容模式 不能$.post (不是a 连接 onclick的问题!!)
查看>>
spring注入Properties
查看>>
jmeter(五)创建web测试计划
查看>>
python基本数据类型
查看>>
1305: [CQOI2009]dance跳舞 - BZOJ
查看>>
将html代码中的大写标签转换成小写标签
查看>>
jmeter多线程组间的参数传递
查看>>
零散笔记
查看>>
信息浏览器从Android的浏览器中传递cookie数据到App中信息浏览器
查看>>
hash储存机制
查看>>
HI3531uboot开机画面 分类: arm-linux-Ubunt...
查看>>
制作U盘启动CDLinux 分类: 生活百科 ...
查看>>
strcpy函数里的小九九
查看>>