Spring Security教程---- 自定义AccessDeniedHandler

Posted skinchqqhah

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Security教程---- 自定义AccessDeniedHandler相关的知识,希望对你有一定的参考价值。

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

 

[java] view plaincopy技术图片技术图片
 
  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输出到前台,然后在前台做统一的处理就可以了。在前台对后台消息统一处理的方法可以参考我的这篇文章http://blog.csdn.net/jaune161/article/details/18135607

 

最后在配置文件中配置下

 

[html] view plaincopy技术图片技术图片
 
  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>  
session-management本来计划在之前就讲的,但是准备深入讲下session-management所以就一直没有讲。今天既然提到了就简单的说下session-management最简单的配置,就是上面的配置invalid-session-url表示Session失效时跳转的连接。随后会深入讲下这个。

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

以上是关于Spring Security教程---- 自定义AccessDeniedHandler的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security教程:自定义表结构

Spring Security教程:自定义数据库查询

Spring Security教程(10)---- 自定义登录成功后的处理程序及修改默认验证地址

Spring Security 自定义过滤器

Spring Security教程(13)---- 验证码功能的实现

秒懂SpringBoot之全网最易懂的Spring Security教程