自定义AccessDeniedHandler

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

[java] view plaincopy

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

这里我们直接将异常信息通过PrintWriter输出到前台,然后在前台做统一的处理就可以了。在前台对后台消息统一处理的方法可以参考我的这篇文章http://blog.csdn.net/jaune161/article/details/18135607

最后在配置文件中配置下

[html] view plaincopy

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

自定义AccessDeniedHandler的相关文章

微服务之间的通讯安全(四)-JWT优化之日志、错误处理、限流及JWT改造后执行流程梳理

前面我们已经完成了通过JWT的认证和授权的改造,可以看到我们的代码中没有认证和授权的过滤器(Filter)了,基本上由SpringSecurity的过滤器来接管了,接下来我们来看一下怎么在SpringSecurity的过滤器链上加上我们自己的逻辑,比如日志和限流. 1.在SpringSecurity过滤器链上添加审计过滤器 1.1.创建日志过滤器,因为我们根据我们之前审计机制的位置,要把日志过滤器放到认证之后,授权之前.认证的过滤器会把JWT令牌转化为Authentication,然后放到安全上

Spring Security应用开发(05)自定义表单认证

Spring Security自动产生的登录页面非常简陋,但是Spring Security提供了丰富的自定义功能. 1.1.1. 密码摘要处理 数据库中的密码字段可以使用SHA摘要算法处理后再保存,而不是以明文保存. mysql> select * from users; +----------+----------+---------+ | username | password | enabled | +----------+----------+---------+ | lisi | 1

Spring security3.x 自定义验证Filter

原创文章,欢迎转载!转载时务必保留:作者:jmppok ;出处http://blog.csdn.net/jmppok/article/details/44833545 1.applicationContext-secrity.xml配置 <?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/secur

springboot2.0整合springsecurity前后端分离进行自定义权限控制

在阅读本文之前可以先看看springsecurity的基本执行流程,下面我展示一些核心配置文件,后面给出完整的整合代码到git上面,有兴趣的小伙伴可以下载进行研究 使用maven工程构建项目,首先需要引入最核心的依赖, <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> <

Linux centos下让alias自定义永久生效(+常用的别名)

alias可以简化一些复杂的命令串,使一个单词或简化后的命令即可实现复杂(通常是带很多参数的长串)命令. 基本用法: alias 简化命令='实际的长串命令'    //实际长串命令通常为'原命令 -/选项参数' eg. alias ll='ls -a' 获取别名: alias        //即可查看当前设定的所有alias别名 取消别名: unalias 简化命令 eg. unalias ll            //取消ll的别名 永久生效: 直接使用alias命令定义的别名,重启后就

MVC4 自定义错误页面(三)

一.概述 MVC4框架自带了定义错误页,该页面位于Shared/Error,该页面能够显示系统未能捕获的异常,如何才能使用该页面: 二.使用步骤: 1.配置WebConfig文件,在System.Web节点下加上 <customErrors mode="On"  defaultRedirect="~/Shared/Error" /> 翻阅一些大神写的博客,在他们的博客中指出defaultRedirect是指向错误页面的URL,可是经过本人测试的时候,发现

自定义及发布一个webservice服务

自定义及发布一个webservice服务    - 声明 某个业务服务为webservice服务       通过@webservice 注解来声明    - 发布webservice服务       Endpoint.publish()发布 (默认对public修饰的方法进行发布)    - 通过wsimport生成本地代理来访问自己发布的webservice       wsimport 1.发布自定义webservice phone.java package ws.myWebService

前端angularJS利用directive实现移动端自定义软键盘的方法

最近公司项目的需求上要求我们iPad项目上一些需要输入数字的地方用我们自定义的软键盘而不是移动端设备自带的键盘,刚接到需求有点懵,因为之前没有做过,后来理了一下思路发现这东西也就那样.先看一下实现之后的效果: 实现的效果就是当点击页面中需要弹出软键盘的时候软键盘弹出,浮在页面的中间,和模态框一样的效果,可以在软键盘中输入任何数字,附带的功能有小数点.退格.清空.确定等功能.当在键盘上点击数字的时候页面中的表单中实时的添加对应的数字,上图中可以看到. 产品经理那边给的原因是iPad屏幕本来就小,如

自定义input[type=&quot;checkbox&quot;]的样式

对复选框自定义样式,我们以前一直用的脚本来实现,不过现在可以使用新的伪类 :checkbox 来实现. 如果直接对复选框设置样式,那么这个伪类并不实用,因为没有多少样式能够对复选框起作用.不过,倒是可以基于复选框的勾选状态借助组合选择符来给其他元素设置样式. 很多时候,无论是为了表单元素统一,还是为了用户体验良好,我们都会选择 label 元素和 input[type="checkbox"] 一起使用.当<label>元素与复选框关联之后,也可以起到触发开关的作用. 思路: