本文基于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 的工作流程。Shiro 提供了 Filter(过滤器)机制,通过配置可以在 Web 应用的入口处...
5. **错误处理**:当 AJAX 请求被 Shiro 拦截器拒绝时,返回相应的错误信息,前端可以根据这些信息展示错误提示。 6. **前端响应**:前端接收到服务器响应后,根据状态码和返回信息,决定是否显示或隐藏特定功能。 ...
- **返回Json数据**:如果用户的请求是Ajax请求,则期望在没有权限的情况下返回一个JSON格式的数据,告知用户权限不足。 如果不区分这两种请求类型,将导致不一致的用户体验。例如,对于Ajax请求来说,如果仍然跳转...
springboot项目,shiro做登录认证,其中pom.xml中...登录传参都要用ajax方式传参发送请求,json格式,不要像我犯了一个低级的问题,还用from表单提交,登录又用ajax,结果怎么都验证不通过,也是绝了,有问题可以讨论!
Shiro则是一个强大且易用的Java安全框架,处理认证、授权、加密和会话管理。当两者结合,可以为基于RESTful API的Web应用提供安全控制。 **一、SpringBoot与Shiro的集成** 1. **依赖添加**:首先,在`pom.xml`文件...
本示例项目“springboot集成jwt和shiro实现前后端分离权限demo”旨在帮助初学者理解如何在Spring Boot环境下结合JWT(JSON Web Token)和Shiro进行权限管理,以实现安全的Web应用。下面将详细介绍相关的知识点。 **...
这可能涉及到Ajax请求、JSON Web Tokens (JWT)或者OAuth2等技术,使得前端能够根据用户的权限动态展示界面元素或执行操作。 在`shiro-master`这个文件夹中,通常会包含以下结构: - `src/main/java`:存放Java源...
- **异步请求处理**:Shiro可以很好地处理AJAX请求,通过设置过滤器链,确保对异步请求的安全拦截。 - **JSON响应**:配置Shiro返回JSON格式的错误信息,方便前端处理错误状态。 - **跨域资源共享(CORS)**:若...
5. **前后端交互**:涉及JSON格式数据的处理,前端通过Ajax发送请求,后端使用Controller处理请求并返回响应。 6. **模板引擎与视图解析**:如Thymeleaf的使用,将后台数据渲染到前端页面。 7. **单元测试**:了解...
在前后端分离的架构下,前端通过发送Ajax请求与后端进行通信,JWT通常被包含在请求头中,由后端验证并返回相应的数据。这种设计模式降低了前端和后端的耦合度,使得前后端可以独立开发和部署,提升了开发效率。 总...
8. **JSON格式**:在AJAX请求和响应中,JSON(JavaScript Object Notation)格式常用于数据交换,因其轻量级和易于解析的特性而广受欢迎。 9. **版本控制**:开发过程中,Git可能被用作版本控制系统,便于团队协作...
3. **前后端分离**:Vue.js作为前端,通过Ajax请求与SpringBoot后端进行数据交互,实现CRUD操作,如添加、删除、修改和查询教务信息。 4. **API设计**:SpringBoot提供RESTful API接口,允许Vue.js前端以JSON格式...
通信方式通常采用API接口,后端通过HTTP RESTful API提供数据,前端通过Ajax请求获取并渲染。在Springboot中,Controller层只需返回JSON数据,不再涉及视图模板。 ### 二、后端——Springboot Springboot简化了Java...
主要功能:实现Spring,SpringMVC,Mybatis的集成,使用Druid数据源,封装JsonData前端数据返回对象以及集成了Mybatis的代码生成(使用程序的方式)。 master: 基本的ssm搭建ssm-redis: ssm与redis整合ssm-fastdfs: ...
Web界面通过Ajax或RESTful API与后端交互,展示和处理用户请求。 在实际开发过程中,可能会涉及到以下关键技术点: 1. SpringBoot配置:包括日志、数据库连接、定时任务、异常处理等。 2. Dubbo配置:服务提供者和...
基本框架 基础的SSM框架,集成了shiro作为登陆验证和权限管理...简单来说,前端使用AJAX请求后台接口,后台都数据进行处理后返回给前端,这个过程我们多半使用json格式来传递数据(也可以使用XML等),而对于前端使用V
- 页面框架和技术:jQuery用于事件处理、Ajax请求和页面操作,Jqzoom处理图片放大,Jquery-validator执行输入验证。 - 权限安全控制:利用Apache Shiro框架实现,Shiro提供角色和资源的权限验证,并可与CAS单点...
3.使用jfinal-web实现根据ajax请求返回json数据,其他返回默认数据,支持继承JFController使用getModels获取对象列表,继承Model封装,避免写大量重复的sql代码,使用ehcache缓存等多个特性 4.使用jfinal-sqlinxml...