spring security 3中关于ajax的处理

在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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值