shiro 返回 json

在使用shiro过程中,发现shiro对没有权限的处理都是跳转到配置文件中的unauthorizedUrl。如果是ajax类的请求,需要返回json时,就需要自定义filter并重写onAccessDenied方法。

比如需要在验证用户权限时返回json,就需要自定义roles的filter。

public class MyRolesFilter extends RolesAuthorizationFilter {

	

	@Override
	protected boolean onAccessDenied(ServletRequest request, ServletResponse response)
			throws IOException {

		Subject subject = getSubject(request, response);
		// If the subject isn't identified, redirect to login URL
		if (subject.getPrincipal() == null) {
			saveRequestAndRedirectToLogin(request, response);
		} else {
			// If subject is known but not authorized, redirect to the
			// unauthorized URL if there is one
			// If no unauthorized URL is specified, just return an unauthorized
			// HTTP status code
			String unauthorizedUrl = getUnauthorizedUrl();
			String ajaxHeader = ((HttpServletRequest)request).getHeader("X-Requested-With");
			if (ajaxHeader != null && "XMLHttpRequest".equals(ajaxHeader)) {
				response.reset();
				response.setContentType("application/json");
				response.setCharacterEncoding("utf-8");
				response.getWriter().write("{\"msg\":\"没有权限\"}");
				response.flushBuffer();
			}
			
			// SHIRO-142 - ensure that redirect _or_ error code occurs - both
			// cannot happen due to response commit:
			else if (StringUtils.hasText(unauthorizedUrl)) {
				WebUtils.issueRedirect(request, response, unauthorizedUrl);
			} 

			else {
				WebUtils.toHttp(response).sendError(HttpServletResponse.SC_UNAUTHORIZED);
			}
		}
		return false;
	}

}
这个方法直接复制org.apache.shiro.web.filter.authz.AuthorizationFilter的onAccessDenied方法,黄色部分是自己添加的。思路就是在原来的判断方法前加上对ajax请求的判断,如果是ajax请求,返回json,如果不是,还是走默认的返回方式。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值