`
y806839048
  • 浏览: 1120807 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

shiro,ajax请求认证失败返回json(正式)

阅读更多

本文基于Shiro权限注解方式来控制Controller方法是否能够访问。 
例如使用到注解: 
@RequiresPermissions 来控制是否有对应权限才可以访问 
@RequiresUser 来控制是否存在用户登录状态才可以访问

想了解Shiro是如何通过注解来控制权限的,可以查看源码 AopAllianceAnnotationsAuthorizingMethodInterceptor ,其构造方法中添加了几个对应的权限注解方法拦截器(这里不做详细阐述)。

用户在请求使用这些注解方式控制的方法时,如果没有通过权限校验。Shiro 会抛出如下两组类型的异常。

登录认证类异常 UnauthenticatedException.class, AuthenticationException.class 
权限认证类异常 UnauthorizedException.class, AuthorizationException.class 
(每个具体的异常对应哪个注解,大家查看源码了解一下)

言归正传,直接上代码,通过代码来说明本文目的 “做Ajax请求的时候,如果请求的URL是被注解权限控制的,在没有权限或者登陆失效的情况下,如果获得JSON方式的返回结果(如果用户没有登录,大多数都是直接跳转到登录页面了)”。

通过一个 BaseController 来统一处理,然后被其他 Controller 继承即可,对于JSON和页面跳转,我们只需要做一个Ajax判断处理即可。

代码如下:

/**
 * BaseController
 *
 * @author 单红宇(365384722)
 * @myblog http://blog.csdn.net/catoop/
 * @create 2017年4月4日
 */
public abstract class BaseController {

    /**
     * 登录认证异常
     */
    @ExceptionHandler({ UnauthenticatedException.class, AuthenticationException.class })
    public String authenticationException(HttpServletRequest request, HttpServletResponse response) {
        if (WebUtilsPro.isAjaxRequest(request)) {
            // 输出JSON
            Map<String,Object> map = new HashMap<>();
            map.put("code", "-999");
            map.put("message", "未登录");
            writeJson(map, response);
            return null;
        } else {
            return "redirect:/system/login";
        }
    }

    /**
     * 权限异常
     */
    @ExceptionHandler({ UnauthorizedException.class, AuthorizationException.class })
    public String authorizationException(HttpServletRequest request, HttpServletResponse response) {
        if (WebUtilsPro.isAjaxRequest(request)) {
            // 输出JSON
            Map<String,Object> map = new HashMap<>();
            map.put("code", "-998");
            map.put("message", "无权限");
            writeJson(map, response);
            return null;
        } else {
            return "redirect:/system/403";
        }
    }

    /**
     * 输出JSON
     *
     * @param response
     * @author SHANHY
     * @create 2017年4月4日
     */
    private void writeJson(Map<String,Object> map, HttpServletResponse response) {
        PrintWriter out = null;
        try {
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/json; charset=utf-8");
            out = response.getWriter();
            out.write(JsonUtil.mapToJson(map));
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (out != null) {
                out.close();
            }
        }
    }
}
public class WebUtilsPro {

    /**
     * 是否是Ajax请求
     *
     * @param request
     * @return
     * @author SHANHY
     * @create 2017年4月4日
     */
    public static boolean isAjaxRequest(HttpServletRequest request) {
        String requestedWith = request.getHeader("x-requested-with");
        if (requestedWith != null && requestedWith.equalsIgnoreCase("XMLHttpRequest")) {
            return true;
        } else {
            return false;
        }
    }
}

下面是一个普通的 Controller

@Controller
@RequestMapping
public class PageController extends BaseController{

    @RequiresUser
    @RequestMapping(value="/main", method=RequestMethod.GET)
    public String main(Model model){
        return "main";
    }

    @RequiresUser
    @RequestMapping(value="/getData", method=RequestMethod.POST)
    @ResponseBody
    public List<String> getData(Model model){
        List<String> list = new ArrayList<>();
        list.add("data1");
        list.add("data2");
        return list;
    }

}

当我们使用 ajax 方式去请求 /getData 时,如果用户没有登录。则会返回对应没有登录的JSON结果。 
页面在做ajax请求时候,发现用户没有登录,可能需要根据响应结果做对用的页面交互处理,而不是暴力的直接重定向到登录页面了。

分享到:
评论

相关推荐

    自定义shiro实现识别ajax请求的拒绝返回json,还是普通返回页面

    本篇文章将深入探讨如何使用 Shiro 自定义实现识别 AJAX 请求,并根据请求类型返回 JSON 或普通页面。 首先,我们需要理解 Shiro 的工作流程。Shiro 提供了 Filter(过滤器)机制,通过配置可以在 Web 应用的入口处...

    Shiro和AJAX完美整合

    5. **错误处理**:当 AJAX 请求被 Shiro 拦截器拒绝时,返回相应的错误信息,前端可以根据这些信息展示错误提示。 6. **前端响应**:前端接收到服务器响应后,根据状态码和返回信息,决定是否显示或隐藏特定功能。 ...

    Shiro权限控制-区分Ajax请求

    - **返回Json数据**:如果用户的请求是Ajax请求,则期望在没有权限的情况下返回一个JSON格式的数据,告知用户权限不足。 如果不区分这两种请求类型,将导致不一致的用户体验。例如,对于Ajax请求来说,如果仍然跳转...

    java+springboot+shiro

    springboot项目,shiro做登录认证,其中pom.xml中...登录传参都要用ajax方式传参发送请求,json格式,不要像我犯了一个低级的问题,还用from表单提交,登录又用ajax,结果怎么都验证不通过,也是绝了,有问题可以讨论!

    SpringBoot整合Shiro

    Shiro则是一个强大且易用的Java安全框架,处理认证、授权、加密和会话管理。当两者结合,可以为基于RESTful API的Web应用提供安全控制。 **一、SpringBoot与Shiro的集成** 1. **依赖添加**:首先,在`pom.xml`文件...

    springboot集成jwt和shiro实现前后端分离权限demo

    本示例项目“springboot集成jwt和shiro实现前后端分离权限demo”旨在帮助初学者理解如何在Spring Boot环境下结合JWT(JSON Web Token)和Shiro进行权限管理,以实现安全的Web应用。下面将详细介绍相关的知识点。 **...

    shiro:shiro示范项目

    这可能涉及到Ajax请求、JSON Web Tokens (JWT)或者OAuth2等技术,使得前端能够根据用户的权限动态展示界面元素或执行操作。 在`shiro-master`这个文件夹中,通常会包含以下结构: - `src/main/java`:存放Java源...

    spring boot集成shrio

    - **异步请求处理**:Shiro可以很好地处理AJAX请求,通过设置过滤器链,确保对异步请求的安全拦截。 - **JSON响应**:配置Shiro返回JSON格式的错误信息,方便前端处理错误状态。 - **跨域资源共享(CORS)**:若...

    SpringBoot+Shiro权限管理系统脚手架.zip

    5. **前后端交互**:涉及JSON格式数据的处理,前端通过Ajax发送请求,后端使用Controller处理请求并返回响应。 6. **模板引擎与视图解析**:如Thymeleaf的使用,将后台数据渲染到前端页面。 7. **单元测试**:了解...

    SpringBoot,Shiro,JWT,Vue &amp; Ant Design 前后端分离权限管理系统,预览地址.zip

    在前后端分离的架构下,前端通过发送Ajax请求与后端进行通信,JWT通常被包含在请求头中,由后端验证并返回相应的数据。这种设计模式降低了前端和后端的耦合度,使得前后端可以独立开发和部署,提升了开发效率。 总...

    [信息办公]AJAX版CD管理系统_ajaxcd.zip

    8. **JSON格式**:在AJAX请求和响应中,JSON(JavaScript Object Notation)格式常用于数据交换,因其轻量级和易于解析的特性而广受欢迎。 9. **版本控制**:开发过程中,Git可能被用作版本控制系统,便于团队协作...

    springboot+shiro+vue实现的简易教务系统.zip

    3. **前后端分离**:Vue.js作为前端,通过Ajax请求与SpringBoot后端进行数据交互,实现CRUD操作,如添加、删除、修改和查询教务信息。 4. **API设计**:SpringBoot提供RESTful API接口,允许Vue.js前端以JSON格式...

    Springboot+Vue+shiro实现前后端分离、权限控制的示例代码

    通信方式通常采用API接口,后端通过HTTP RESTful API提供数据,前端通过Ajax请求获取并渲染。在Springboot中,Controller层只需返回JSON数据,不再涉及视图模板。 ### 二、后端——Springboot Springboot简化了Java...

    ssm:自用的ssm的web集成环境。数据源druid,封装的JsonData数据对象,集成的Hibernate Validator数据校验,异常异常处理(Ajax请求+页面请求),mybatis代码生成,开箱即用

    主要功能:实现Spring,SpringMVC,Mybatis的集成,使用Druid数据源,封装JsonData前端数据返回对象以及集成了Mybatis的代码生成(使用程序的方式)。 master: 基本的ssm搭建ssm-redis: ssm与redis整合ssm-fastdfs: ...

    基于Dubbo和Shiro框架搭建的权限管理系统.zip

    Web界面通过Ajax或RESTful API与后端交互,展示和处理用户请求。 在实际开发过程中,可能会涉及到以下关键技术点: 1. SpringBoot配置:包括日志、数据库连接、定时任务、异常处理等。 2. Dubbo配置:服务提供者和...

    ssm:基于RESTful风格的前合并分离的SSM框架,集成了shiro和swagger等框架

    基本框架 基础的SSM框架,集成了shiro作为登陆验证和权限管理...简单来说,前端使用AJAX请求后台接口,后台都数据进行处理后返回给前端,这个过程我们多半使用json格式来传递数据(也可以使用XML等),而对于前端使用V

    技术架构规范标准.doc

    - 页面框架和技术:jQuery用于事件处理、Ajax请求和页面操作,Jqzoom处理图片放大,Jquery-validator执行输入验证。 - 权限安全控制:利用Apache Shiro框架实现,Shiro提供角色和资源的权限验证,并可与CAS单点...

    jfinal插件集合demojfinal-demo.zip

    3.使用jfinal-web实现根据ajax请求返回json数据,其他返回默认数据,支持继承JFController使用getModels获取对象列表,继承Model封装,避免写大量重复的sql代码,使用ehcache缓存等多个特性 4.使用jfinal-sqlinxml...

Global site tag (gtag.js) - Google Analytics