原因:当我们使用Shiro发送AJAX请求的时候,会自动跳转页面(而AJAX不能跳转页面,添砖会出很多错误)

因为是shiro自己的原因,所以我们需要使用我们自己定义的

在shiro中使用这个类PermissionsAuthorizationFilter来过滤请求所以覆写

AJAX特点

普通请求

AJAX和shiro的请求问题

 

 

 AJAX和shiro的请求问题

 

 

 AJAX

AJAX和shiro的请求问题

 

 

 

 AJAX和shiro的请求问题

 

 

 所以我们可以通过七种不同来判断是否为AJAX请求

 写一个类继承PermissionsAuthorizationFilter

package cn.jiedada.aisell.web.shiro;

import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.StringUtils;
import org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter;
import org.apache.shiro.web.util.WebUtils;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 写一个自己的Shiro来判断出我们需要的东西处理Ajax权限
 */
public class AisellPermissionsAuthorizationFilter extends PermissionsAuthorizationFilter {

    @Override
    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws IOException {
        Subject subject = this.getSubject(request, response);
        //判断用户是否登陆
        if (subject.getPrincipal() == null) {
            this.saveRequestAndRedirectToLogin(request, response);
        } else {
            //只用通过HttpServletRequest才能获得请求头中的数据才能判断
            HttpServletRequest httpRequest = (HttpServletRequest) request;
            HttpServletResponse httpResponse=(HttpServletResponse)response;
            //查看是否是AjAX请求
            String xRequested = httpRequest.getHeader("X-Requested-With");
            if(xRequested!=null&&"XMLHttpRequest".equals(xRequested)){
                //传入前需要在请求头中传入响应,让他知道我们返回的数据是AJAX请求
                httpResponse.setContentType("text/json; charset=UTF-8");
                //带回AJAX请求,把数据作为流传回去这里需要传出标准的json数据格式
                httpResponse.getWriter().print( "{\"success\":false,\"msg\":\"没有权限\"}");

            }else {
                String unauthorizedUrl = this.getUnauthorizedUrl();
                if (StringUtils.hasText(unauthorizedUrl)) {
                    WebUtils.issueRedirect(request, response, unauthorizedUrl);
                } else {
                    WebUtils.toHttp(response).sendError(401);
                }
            }
        }
        return false;
    }
}
View Code

相关文章: