自定义shiro实现识别ajax请求的拒绝返回json,还是普通返回页面
类似其他的自定义只要重写过滤器中相应的方法即可:
客户端请求标志:
String contentType = httpServletRequest.getHeader("content-type");
application/json : JSON数据格式(ajax)
application/x-www-form-urlencoded :表单提交
null 浏览器直接请求
没有登录,正在登陆时每次进入登录过滤器
这时ajax请求用json格式返回失败即可(就不是返回整个失败页面),登录成功才可以请求正常请求json
登录后每次请求进入角色过等滤器
ajxa请求,json没有权限处理角色中处理json没有权限的返回即可(就不是整个页面返回),一般的请求返回登录页面也即可
FormAuthenticationFilter:MyAuthenticationFilter
进入onAccessDenied(区分ajax和普通请求,控制跳转返回格式)就已经是拒绝了,这里做拒绝后的处理,或者首次登陆的处理
onLoginSuccess登录成功之后(登录之后跳转到loginurl),做的事情(setsession)
onLoginFailure:处理登录失败后的处理(ajax请求返回json格式(里面带有自定义拒绝标志信息,和错误代码),普通请求返回拒绝页面)
AuthorizationFilter: RoleAuthorizationFilter
isAccessAllowed(定义判断是否有权限的规则)
判断角色是否具备访问要求
onAccessDenied
角色不具备的时候做的处理(ajax请求返回json格式(里面带有自定义拒绝标志信息,和错误代码),普通请求返回拒绝页面)
这两个未成功的时候都不会清除登录信息,才满足这两种情况:
1,拒绝就跳登录页面(见到的菜单都是自己有权限的情况下可以),unauthorizedUrl:没有权限默认跳转的页面。
2,当要求全部显示菜单,没有权限的菜单
就跳到提示页就提示,其他正常访问(并没有清除用户登录信息)就不能简单跳到登陆页
AuthorizationFilter(已登录):
FormAuthenticationFilter(要登录):
当需要没有权限就登出的时候在onAccessDenied中调用LogoutFilter清除登录信息
FormAuthenticationFilter:MyAuthenticationFilter
@Override
protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//String requestType = request.getHeader("X-Requested-With");
String requestType = (request .getHeader("X-Requested-With")==null?request .getHeader("x-requested-with"):null);
String contentType = request.getHeader("content-type");
request.getHeaderNames();
if ((requestType != null && requestType.equalsIgnoreCase("XMLHttpRequest"))||(contentType!=null && contentType.equalsIgnoreCase("application/json; charset=utf-8"))) {
response.addHeader("loginStatus", "accessDenied");
response.sendError(HttpServletResponse.SC_FORBIDDEN);//403
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json");
//HttpServletResponse rs=new HttpServletResponse();
//response.
//ServletServerHttpResponse responseHeader = new ServletServerHttpResponse(rs);
//responseHeader.getHeaders().add("loginStatus", "accessDenied");
//response.getWriter().write(JSONObject.toJSONString(responseHeader));
return false;
}
//if ((requestType != null && requestType.equalsIgnoreCase("XMLHttpRequest"))) {
//
//response.addHeader("loginStatus", "accessDenied");
//response.sendError(HttpServletResponse.SC_FORBIDDEN);//403
//response.setCharacterEncoding("UTF-8");
//response.setContentType("application/json");
////HttpServletResponse rs=new HttpServletResponse();
////response.
////ServletServerHttpResponse responseHeader = new ServletServerHttpResponse(rs);
////responseHeader.getHeaders().add("loginStatus", "accessDenied");
////response.getWriter().write(JSONObject.toJSONString(responseHeader));
//return false;
//}
String method = request.getMethod();
if("GET".equalsIgnoreCase(method)){
WebUtils.issueRedirect(request, response, "/");
return false;
}
return super.onAccessDenied(request, response);
}
AuthorizationFilter: RoleAuthorizationFilter
这两个的onAccessDenied都应如此写
@Override
protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws IOException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
//String requestType = httpServletRequest.getHeader("X-Requested-With");
String requestType = (httpServletRequest.getHeader("X-Requested-With")==null?httpServletRequest.getHeader("x-requested-with"):null);
String contentType = httpServletRequest.getHeader("content-type");
if ((requestType != null && requestType.equalsIgnoreCase("XMLHttpRequest"))||(contentType!=null && contentType.equalsIgnoreCase("application/json; charset=utf-8"))) {
httpServletResponse.addHeader("loginStatus", "accessDenied");
httpServletResponse.sendError(HttpServletResponse.SC_FORBIDDEN);//403
httpServletResponse.setCharacterEncoding("UTF-8");
httpServletResponse.setContentType("application/json");
//HttpServletResponse rs=new HttpServletResponse();
//response.
//ServletServerHttpResponse responseHeader = new ServletServerHttpResponse(rs);
//responseHeader.getHeaders().add("loginStatus", "accessDenied");
//response.getWriter().write(JSONObject.toJSONString(responseHeader));
return false;
} else {//如果是普通请求进行重定向
httpServletResponse.sendRedirect("/");
}
return false;
}
注意
MyAuthenticationFilter中onLoginSuccess中的session.stop();需要注掉,否则用框架的登陆走了onLoginSuccess然后又清了session会报错
无论权限,认证都有判断拒绝,以及拒绝后的动作,所以拒绝返回json需要在这两种情况下都写
AuthorizationFilter----isAccessAllowed---onAccessDenied 权限失败
FormAuthenticationFilter---
isAccessAllowed---onAccessDenied 首次登陆的时候
onLoginFailure 登录认证失败
onLoginSuccess
参考:
http://blog.csdn.net/u014042146/article/details/72834582
http://blog.csdn.net/qq_20989105/article/details/78075660?locationNum=9&fps=1
相关推荐
本demo为Spring boot整合shiro,以mybatis plus做dao层交互数据,实现了读取数据库用户数据实现用户登录,权限认证,读取数据库中用户对应的url请求,实现请求的过滤。自定义了relam和过滤器来实现这些功能
5. **错误处理**:当 AJAX 请求被 Shiro 拦截器拒绝时,返回相应的错误信息,前端可以根据这些信息展示错误提示。 6. **前端响应**:前端接收到服务器响应后,根据状态码和返回信息,决定是否显示或隐藏特定功能。 ...
- **返回Json数据**:如果用户的请求是Ajax请求,则期望在没有权限的情况下返回一个JSON格式的数据,告知用户权限不足。 如果不区分这两种请求类型,将导致不一致的用户体验。例如,对于Ajax请求来说,如果仍然跳转...
SpringBoot基于Shiro处理ajax请求代码实例详解 本文将详细介绍SpringBoot基于Shiro处理ajax请求代码实例,通过示例代码,详细地介绍了Shiro的配置和使用方法,对大家的学习或者工作具有一定的参考学习价值。 Shiro...
- Servlet Filter 配置:Shiro 的过滤器链是通过 `web.xml` 或者 Spring MVC 配置文件来定义的,它们控制着哪些请求需要经过 Shiro 的安全检查。 - 自定义 Realm 类:这个类会实现上述的认证和授权逻辑,可能包含...
2. **配置Shiro**:创建自定义Realm,实现认证和授权逻辑。配置Shiro的ini配置文件,指定Realm和会话管理策略。 3. **配置Spring Session**:在Spring Boot的配置文件中启用Spring Session,并选择Redis作为存储后端...
SpringBoot集成Shiro实现动态URI权限是一个常见的权限管理实践,主要目的是为了实现更灵活、更安全的用户访问控制。在Web应用中,权限控制通常包括角色管理、菜单管理、操作权限(URI)管理等,而动态URI权限则允许...
在实现URL权限控制时,Shiro通过定义一系列的拦截器(Interceptors)来过滤请求。这些拦截器可以基于URL路径或特定的HTTP方法(如GET、POST等)来决定是否允许用户访问。Shiro的Web模块提供了一个名为`...
shiro ajax 删除 没有权限 不跳转页面 或者没有反应
【RBAC】基于springboot+shiro实现RBAC权限后台管理系统.zip 项目结构 |—— ctrl —— 请求层 |—— service —— 业务层 |—— common |—— |—— annotation —— 项目中使用的注解 |—— |—— aspect —— ...
Spring Boot 自定义 Shiro 过滤器无法使用 @Autowired 问题及解决方法 在 Spring Boot 中集成 Shiro 并使用 JWT 进行接口认证时,可能会遇到自定义 Shiro 过滤器无法使用 @Autowired 问题。下面将详细介绍该问题及...
在这个"shiro实现代码"的项目中,我们可以看到它是如何与Nutz框架结合来实现用户的身份验证和权限控制的。 Nutz 是一个轻量级的Java Web开发框架,它提供了丰富的MVC功能,使得开发者可以更高效地构建应用程序。将...
- 使用Shiro拦截器检查请求,未登录的用户会被重定向到认证中心。 - 登录成功后,将Token存储在Redis中,并将其作为Cookie返回给客户端。 - 在其他子系统中,通过Shiro拦截器检查Cookie中的Token,如果有效,则...
如果令牌无效或过期,Shiro将阻止请求并返回相应的错误信息。 5. **授权策略**:Shiro支持基于角色的访问控制(RBAC),可以根据角色分配不同的权限。在Controller层,可以使用Shiro注解`@RequiresPermissions`和`@...
Vue.js作为一个轻量级的前端框架,搭配Apache Shiro这样的安全管理框架,可以有效地实现前端的细粒度权限管理,如按钮级别的权限控制。本文将详细介绍如何在Vue项目中结合Shiro实现这一功能,以及所需的前置技术。 ...
3. **Shiro的集成**:研究如何在SpringBoot应用中配置Shiro,包括安全配置、 Realm(认证和授权信息提供者)的实现以及自定义注解的编写和使用。 4. **Shiro的权限控制**:掌握如何使用Shiro的注解进行权限判断,如@...
在Spring Boot中,我们可以通过Shiro的过滤器链来实现请求的拦截和处理。创建一个自定义的Realm,继承自`AuthorizingRealm`,并在其中实现认证和授权逻辑。 Realm是Shiro与应用数据源交互的核心,它可以对接数据库或...
在实际项目中,`shiro-root`目录可能包含了Shiro的配置文件(如shiro.ini或shiro.xml)、Spring整合Shiro的相关配置、以及自定义Realm的实现等。我们需要根据项目需求配置Shiro的安全策略,包括密码加密算法、未授权...
首先,Shiro 提供了一个 `LogoutFilter` 过滤器,用于处理用户的登出请求。默认情况下,`LogoutFilter` 在用户登出时会清除会话中的所有信息,包括已认证的主体(Subject)和相关的权限信息。但是,如果我们需要在...