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

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

阅读更多

 

自定义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

 

 

 

 

分享到:
评论

相关推荐

    spring boot整合shiro实现url请求过滤

    本demo为Spring boot整合shiro,以mybatis plus做dao层交互数据,实现了读取数据库用户数据实现用户登录,权限认证,读取数据库中用户对应的url请求,实现请求的过滤。自定义了relam和过滤器来实现这些功能

    Shiro和AJAX完美整合

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

    Shiro权限控制-区分Ajax请求

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

    SpringBoot基于Shiro处理ajax请求代码实例

    SpringBoot基于Shiro处理ajax请求代码实例详解 本文将详细介绍SpringBoot基于Shiro处理ajax请求代码实例,通过示例代码,详细地介绍了Shiro的配置和使用方法,对大家的学习或者工作具有一定的参考学习价值。 Shiro...

    从实例入手学习Shiro自定义Realm实现查询数据进行验证示例代码.zip

    - Servlet Filter 配置:Shiro 的过滤器链是通过 `web.xml` 或者 Spring MVC 配置文件来定义的,它们控制着哪些请求需要经过 Shiro 的安全检查。 - 自定义 Realm 类:这个类会实现上述的认证和授权逻辑,可能包含...

    shiro实现单点登录

    2. **配置Shiro**:创建自定义Realm,实现认证和授权逻辑。配置Shiro的ini配置文件,指定Realm和会话管理策略。 3. **配置Spring Session**:在Spring Boot的配置文件中启用Spring Session,并选择Redis作为存储后端...

    SpringBoot 集成 Shiro 实现动态uri权限

    SpringBoot集成Shiro实现动态URI权限是一个常见的权限管理实践,主要目的是为了实现更灵活、更安全的用户访问控制。在Web应用中,权限控制通常包括角色管理、菜单管理、操作权限(URI)管理等,而动态URI权限则允许...

    基于Shiro 拦截URL,实现权限控制

    在实现URL权限控制时,Shiro通过定义一系列的拦截器(Interceptors)来过滤请求。这些拦截器可以基于URL路径或特定的HTTP方法(如GET、POST等)来决定是否允许用户访问。Shiro的Web模块提供了一个名为`...

    已经解决shiro登录 ajax交互

    shiro ajax 删除 没有权限 不跳转页面 或者没有反应

    【RBAC】基于springboot+shiro实现RBAC权限后台管理系统.zip

    【RBAC】基于springboot+shiro实现RBAC权限后台管理系统.zip 项目结构 |—— ctrl —— 请求层 |—— service —— 业务层 |—— common |—— |—— annotation —— 项目中使用的注解 |—— |—— aspect —— ...

    Spring Boot 自定义 Shiro 过滤器无法使用 @Autowired问题及解决方法

    Spring Boot 自定义 Shiro 过滤器无法使用 @Autowired 问题及解决方法 在 Spring Boot 中集成 Shiro 并使用 JWT 进行接口认证时,可能会遇到自定义 Shiro 过滤器无法使用 @Autowired 问题。下面将详细介绍该问题及...

    shiro实现代码

    在这个"shiro实现代码"的项目中,我们可以看到它是如何与Nutz框架结合来实现用户的身份验证和权限控制的。 Nutz 是一个轻量级的Java Web开发框架,它提供了丰富的MVC功能,使得开发者可以更高效地构建应用程序。将...

    springboot+redis+shiro单点登录,统一异常处理,统一日志

    - 使用Shiro拦截器检查请求,未登录的用户会被重定向到认证中心。 - 登录成功后,将Token存储在Redis中,并将其作为Cookie返回给客户端。 - 在其他子系统中,通过Shiro拦截器检查Cookie中的Token,如果有效,则...

    SpringBoot + Shiro实现前后端全分离接口安全框架

    如果令牌无效或过期,Shiro将阻止请求并返回相应的错误信息。 5. **授权策略**:Shiro支持基于角色的访问控制(RBAC),可以根据角色分配不同的权限。在Controller层,可以使用Shiro注解`@RequiresPermissions`和`@...

    vue与shiro结合实现权限按钮

    Vue.js作为一个轻量级的前端框架,搭配Apache Shiro这样的安全管理框架,可以有效地实现前端的细粒度权限管理,如按钮级别的权限控制。本文将详细介绍如何在Vue项目中结合Shiro实现这一功能,以及所需的前置技术。 ...

    SpringBoot 、Shiro、 自定义注解权限控制源码下载

    3. **Shiro的集成**:研究如何在SpringBoot应用中配置Shiro,包括安全配置、 Realm(认证和授权信息提供者)的实现以及自定义注解的编写和使用。 4. **Shiro的权限控制**:掌握如何使用Shiro的注解进行权限判断,如@...

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

    在Spring Boot中,我们可以通过Shiro的过滤器链来实现请求的拦截和处理。创建一个自定义的Realm,继承自`AuthorizingRealm`,并在其中实现认证和授权逻辑。 Realm是Shiro与应用数据源交互的核心,它可以对接数据库或...

    shiro实现授权登陆验证

    在实际项目中,`shiro-root`目录可能包含了Shiro的配置文件(如shiro.ini或shiro.xml)、Spring整合Shiro的相关配置、以及自定义Realm的实现等。我们需要根据项目需求配置Shiro的安全策略,包括密码加密算法、未授权...

    java shiro实现退出登陆清空缓存

    首先,Shiro 提供了一个 `LogoutFilter` 过滤器,用于处理用户的登出请求。默认情况下,`LogoutFilter` 在用户登出时会清除会话中的所有信息,包括已认证的主体(Subject)和相关的权限信息。但是,如果我们需要在...

Global site tag (gtag.js) - Google Analytics