您的位置:首页 > 其它

shiro 判断ajax是否通过身份验证

2017-09-08 14:17 295 查看
这篇文章主要是针对使用shiro后ajax请求判断是否经过验证的问题。

代码:

public class RoleAuthorizationFilter extends AuthenticationFilter {

private static int bytes = 1024;
private static int startByte = 0;
private static int endByte = 0;

/**
* shiro 授权失败会进入此方法 判断是否是ajax请求
*/
@Override
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
String serlvetPath = httpRequest.getServletPath();
Subject subject = getSubject(request, response);
if (subject.getPrincipal() == null) {
// 这里判断是否为ajax请求且是以.do结尾的
// 如果不是会走shiro默认的权限流程
if (isAjax(httpRequest) && serlvetPath.contains(".do")) {
returnJsonResult(httpResponse, "您尚未登录或登录时间过长,请重新登录!");
} else {
saveRequestAndRedirectToLogin(request, response);

}
}
return false;
}

private void returnJsonResult(HttpServletResponse httpResponse, String message) {
httpResponse.setStatus(301);
httpResponse.setHeader("Content-type", "application/json;charset=UTF-8");
Result result = new Result();
result.setCode(Const.FAIL);
result.setMessage(message);
Gson gson = new Gson();
String jsonStr = gson.toJson(result);
try {
OutputStream os = httpResponse.getOutputStream();
byte[] jsonByte = jsonStr.getBytes("UTF-8");
int count = jsonByte.length;
while (count > 0) {
if (count < 1024) {
endByte = endByte + count;
} else {
endByte = endByte + bytes;
}
os.write(jsonByte, startByte, endByte);
startByte = endByte;
count = count - bytes;
}
} catch (Exception e) {
}

}

/**
* 判断ajax请求
*
* @param request
* @return
*/
private boolean isAjax(HttpServletRequest request) {
return (request.getHeader("X-Requested-With") != null
&& "XMLHttpRequest".equals(request.getHeader("X-Requested-With").toString()));
}

}


这里说明saveRequestAndRedirectToLogin

进入这个方法是会将当前的请求redirect到spring-shiro.xml配置中的loginUrl
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shiro ajax
相关文章推荐