spring security 3中关于ajax的处理

本文介绍如何在Spring Security中处理AJAX请求的权限问题。通过自定义AccessDeniedHandler,实现未授权情况下的JSON响应,同时提供了前端jQuery扩展来统一处理未授权提示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在spring security 3中,对于某些需要保护的url,可以很容易地实现当没权限的时候, 
redirect到一个页面(比如自定义的404.jsp页面)进行显示没权限的信息; 
但有的时候,必须要对一些AJAX的请求url也同时判断其是否有权限输出; 
如果没权限的话,一般要以JSON的方式返回给用户端,比如弹出一个提示框,显示没权限; 
   在SPRING security 3中,当没权限的时候,会由spring security 自己的拦截器 
AccessDeniedHandler 进行拦截的,因此,可以在这个地方进行扩展自定义, 
然后统一返回给前端的都是json的方式,并且在前端的jquery js中,扩展jquery post的 
方法,如果对json返回的结果中,有相关“没权限操作”的信息,则弹出错误提示框, 
这样,只需要在要用到$ajax提交的页面中,引入js就可以了,下面看代码实现。 


1) 首先,实现AccessDeniedHandler 类; 

public class MyAccessDeniedHandlerImpl implements AccessDeniedHandler  {  
      
    public MyAccessDeniedHandlerImpl(){}  
    public String getAccessDeniedUrl() {  
        return accessDeniedUrl;  
    }  
   
    public void setAccessDeniedUrl(String accessDeniedUrl){  
        this.accessDeniedUrl = accessDeniedUrl;  
    }  
  
	public MyAccessDeniedHandlerImpl(String accessDeniedUrl){  
      this.accessDeniedUrl=accessDeniedUrl;  
	}  
	
    private String accessDeniedUrl;  
  
      
    @Override  
    public void handle(HttpServletRequest req,  
            HttpServletResponse resp, AccessDeniedException reason) throws ServletException,  
            IOException {  
        boolean isAjax = "XMLHttpRequest".equals(req.getHeader("X-Requested-With"));  
          
		//如果是ajax请求  
        if (isAjax) {         
            String jsonObject = "{\"message\":\"You are not privileged to request this resource.\","+  
            //      "\"access-denied\":true,\"cause\":\"AUTHORIZATION_FAILURE\"}";  
            String contentType = "application/json";  
            resp.setContentType(contentType);  
            String jsonObject="noright";  
            PrintWriter out = resp.getWriter();  
            out.print(jsonObject);  
            out.flush();  
            out.close();  
            return;  
        } else {  
			String path = req.getContextPath();  
			String basePath = req.getScheme()+"://"+req.getServerName()+":"+req.getServerPort()+path+"/";  
			resp.sendRedirect(basePath+accessDeniedUrl);  
        }  
    }
}	
在上面的处理中,判断如果是ajax处理,则输出json字符串给客户端,否则就 
redirect到指定的accessDeniedUrl, 

2) 在applicationContext-security.xml中进行设置,如下: 

<http auto-config="true">  
<intercept-url pattern="/admin*" access="ROLE_ADMIN" />  
<access-denied-handler ref="accessDeniedHandler"/>  
  </http>  
  
  
    <beans:bean id="accessDeniedHandler"   
class="com.test.MyAccessDeniedHandlerImpl">  
<beans:property name="accessDeniedUrl" value="403.jsp" />  
  </beans:bean>

3) springsecurity.js 
(function($){  
    // 保存原有的jquery ajax;  
    var $_ajax = $.ajax;  
      
    $.ajax = function(options){  
        var originalSuccess,  
            mySuccess,  
            success_context;  
      
        if (options.success) {  
                        // save reference to original success callback  
            originalSuccess = options.success;  
            success_context = options.context ? options.context : $;  
              
                        // 自定义callback  
            mySuccess = function(data) {  
                  
                  
                                         
                             
                            if (data['access-denied']) {  
                                  if (data.cause==='AUTHENTICATION_FAILURE') {  
                                    alert('登录超时,请重新登录.');  
                    window.location.href = contextPath + '/';  
                                  } else if (data.cause==='AUTHORIZATION_FAILURE') {  
                                       if (data=="noright")  
                                       {  
                                        alert('对不起,你没有访问该资源的权限.');  
                                       }  
                    }  
                                   return;  
                          
                               
                                // call original success callback                             
                originalSuccess.apply(success_context, arguments);  
            };  
                        // override success callback with custom implementation  
            options.success = mySuccess;  
        }  
          
                // call original ajax function with modified arguments  
        $_ajax.apply($, arguments);  
    };  
      
})(jQuery);  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值