shiro解决ajax访问拦截返回json串

硅谷探秘者 4150 0 0

shiro解决ajax访问拦截返回json串


        在shiro自定义拦击的时候一般会继承AuthorizationFilter类重写isAccessAllowed()方法。该方法会根据我们自定义的规则通过返回true,不通过放回false。


        根据框架的一般规则,必然有一个回调方法监控着isAccessAllowed()方法。点进AccessControlFilter类中


menu.saveimg.savepath20190404141717.jpg


        在AccessControlFilter类中会发现有一个onAccessDenied()方法。这个方法正是isAccessAllowed()方法的回调方法,当isAccessAllowed方法返回false的时候调用onAccessDenied()方法进行善后处理,是到登录页,还是错误页等。。。那我们就在这个方法中进行改进。重写onAccessDenied()方法。

package com.dzqc.model.common.shiro;
import java.io.IOException;

import javax.servlet.ServletRequest;  
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.StringUtils;
import org.apache.shiro.web.filter.authz.AuthorizationFilter;
import org.apache.shiro.web.util.WebUtils;

import com.alibaba.fastjson.JSONObject;
import com.dzqc.model.common.entity.ResultData;

/**
 * @author JIAJIAJIA
 * @data 2018年8月31日 下午2:56:12
 * @description TODO
 */
public class CustomRolesAuthorizationFilter extends AuthorizationFilter {  
    /***
     * 请求过滤的回调方法
     */
	@Override
	protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws IOException {
		Subject subject = getSubject(request, response);
        if (subject.getPrincipal() == null) {
        	if (isAjaxRequest((HttpServletRequest)request)) {
        		response.setCharacterEncoding("UTF-8");
            	response.setContentType("application/json");
                ResultData resultData = new ResultData();
                resultData.setResult(1);
                resultData.setCode(401);
                resultData.setMessage("登录认证失效,请重新登录!");
                response.getWriter().write(JSONObject.toJSONString(resultData));
			}else {
				saveRequestAndRedirectToLogin(request, response);
			}
        } else {
            String unauthorizedUrl = getUnauthorizedUrl();
            if(isAjaxRequest((HttpServletRequest)request)) {
            	response.setCharacterEncoding("UTF-8");
            	response.setContentType("application/json");
                ResultData resultData = new ResultData();
                resultData.setResult(2);
                resultData.setCode(402);
                resultData.setMessage("您没有权限执行该操作!");
                response.getWriter().write(JSONObject.toJSONString(resultData));
            }else {
	            if (StringUtils.hasText(unauthorizedUrl)) {
	            	WebUtils.issueRedirect(request, response, unauthorizedUrl);
	            } else {
	                WebUtils.toHttp(response).sendError(HttpServletResponse.SC_UNAUTHORIZED);
	            }
            }
        }
        return false;
	}
	/**
	 * 请求过滤
	 */
    @Override  
    protected boolean isAccessAllowed(ServletRequest req, ServletResponse resp, Object mappedValue) throws Exception {  
        Subject subject = getSubject(req, resp);  
        String[] rolesArray = (String[]) mappedValue;  
  
        if (rolesArray == null || rolesArray.length == 0) { //没有角色限制,有权限访问  
            return true;  
        }  
        for (int i = 0; i < rolesArray.length; i++) {  
            if (subject.hasRole(rolesArray[i])) { //若当前用户是rolesArray中的任何一个,则有权限访问  
                return true;  
            }  
        }  
        return false;
    }  
    
    public static boolean isAjaxRequest(HttpServletRequest request) {
        String requestedWith = request.getHeader("x-requested-with");
        if (requestedWith != null && requestedWith.equalsIgnoreCase("XMLHttpRequest")) {
            return true;
        } else {
            return false;
        }
    }
}



    这样对于ajax请求就会返回我们定义的json串


    当访问有权限的路径

menu.saveimg.savepath20190404142338.jpg


    当访问没有权限的路径时:

menu.saveimg.savepath20190404142427.jpg





评论区
请写下您的评论...
暂无评论...
猜你喜欢
框架 6678 1.登陆器packagecom.dzqc.yx.interceptor;importorg.springframework.web.servlet.HandlerInterceptor
框架 4883 mybatisMap当字段为空时没有属性1.修改mybatis配置文件mybatis:configuration:call-setters-on-nulls:true2.数据库中:3.没有修
框架 5282 springmvc项目中,如一个项目的页面调用另一个项目的接口会产生跨域题403。对于一个接口而言很好跨域题,springmvc中只需要在接口上加一个注。@CrossOrigin
框架 3908 springboot请求json数据不对象的指定字段在实体类的字段上加上注importcom.fasterxml.jackson.annotation.JsonIgnore;例
数据库基础 1743 、substring(str,index)当index0从左边开始取直到结束当index0从右边开始取直到结束当index=0空4、substring(str,index,len)取str,从in
插件 谷歌 1666 谷歌浏览器访程序接口json格式字符时比较混乱,如下图安装此插件后的格式如下图点击右上方按钮下载安装方法打开拓展程序,如下将插件拖到这个界面,点击同意安装插件,安装完成后如上图。
数据库基础 1630 mysql取字符函数总结1.字符取:left(str,length)mysqlselectleft('example.com',3
算法基础 1184 c#对象和json字符转换usingSystem; usingSystem.Runtime.Serialization.Json; usingSystem.IO; usingSystem.Text
归档
2018-11  12 2018-12  33 2019-01  28 2019-02  28 2019-03  32 2019-04  27 2019-05  33 2019-06  6 2019-07  12 2019-08  12 2019-09  21 2019-10  8 2019-11  15 2019-12  25 2020-01  9 2020-02  5 2020-03  16 2020-04  4 2020-06  1 2020-07  7 2020-08  13 2020-09  9 2020-10  5 2020-12  3 2021-01  1 2021-02  5 2021-03  7 2021-04  4 2021-05  4 2021-06  1 2021-07  7 2021-08  2 2021-09  8 2021-10  9 2021-11  16 2021-12  14 2022-01  7 2022-05  1 2022-08  3 2022-09  2 2022-10  2 2022-12  5 2023-01  3 2023-02  1 2023-03  4 2023-04  2 2023-06  3 2023-07  4 2023-08  1 2023-10  1 2024-02  1 2024-03  1 2024-04  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job rabbitmq haproxy srs 音视频 webrtc javascript
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。