ssm整合shiro后,遇到ajax请求的处理

异步请求权限充足时,没有问题,但是当权限不足时,ajax请求之后,就要进入权限不足的界面,但是ajax又不支持整页刷新,所以就要对框架进行修整.

1,添加自定义shiro过滤器,对ajax请求进行过滤

public class RoleAUthorizationFilter extends AuthorizationFilter {

      

       @Override

       protected boolean onAccessDenied(ServletRequest request,

                     ServletResponse response) throws IOException {

             

               Subject subject = getSubject(request, response); 

               Message message = new Message();

                      if (subject.getPrincipal() == null) { 

                          if (MyWebUtils.isAjax(request)) { 

                                 message.setMessage( "您还未登录,请登录系统");

                             MyWebUtils.out(response,message); 

                          } else

                              saveRequestAndRedirectToLogin(request, response);  

                          } 

                      } else

                          if (MyWebUtils.isAjax(request)) { 

                                 message.setFlag(2);

                                 message.setMessage("此账户没有权限,请联系管理员");

                                 MyWebUtils.out(response, message);

                          } else

                              String unauthorizedUrl = getUnauthorizedUrl(); 

                              if (StringUtils.hasText(unauthorizedUrl)) { 

                                  WebUtils.issueRedirect(request, response, unauthorizedUrl); 

                              } else

                                  WebUtils.toHttp(response).sendError(401); 

                              } 

                          } 

                      } 

                      return false

       }

 

       @Override

       protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)

                     throws Exception {

               Subject subject = getSubject(request, response); 

                      String[] rolesArray = (String[]) mappedValue

               

                      if (rolesArray == null || rolesArray.length == 0) { 

                          // no roles specified, sonothing to check - allow access. 

                          return true

                      } 

               

                      Set<String> roles = CollectionUtils.asSet(rolesArray); 

                      for (String role : roles) { 

                          if (subject.hasRole(role)) { 

                              return true

                          } 

                      } 

                      return false

       }

      

      

      

}

查看原码发现 , AuthorizationFilter 是个抽象类 , 它继承了 AccessControlFilter 这个抽象类 , 实现了里面的 onAccessDenied 方法 , 这个方法是校验不通过之后的处理 , 我们要修改 , 就自定义一个过滤器 , 继承 AuthorizationFilter, 重写 isAccessAllowed( 校验通过的方法 ) onAccessDenied 方法 , 把对 ajax 请求的判断加在校验不通过的处理方法中 .

2, 定义好自定义过滤器之后,在shiro.xml中添加权限

<bean id="shiroFilter"class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">

       <property name="securityManager" ref="securityManager" />

       <property name="loginUrl" value="/login"/>

       <property name="successUrl" value="/userLogin" />

       <property name="unauthorizedUrl" value="/unanthorized" />

       <property name="filters">

              <map>

                  <entry key="role">

                     <bean class="com.snowlink.filter.RoleAUthorizationFilter"/>

                  </entry>

              </map>

       </property>

       <!-- 基本系统级别权限配置 -->

       <property name="filterChainDefinitions">

           <value>

              /css/* = anon

              /js/* = anon

              /img/* = anon

              /plugins/* = anon

              /jsp/login.jsp = anon

              /userLogin = anon <!-- 登录相关不拦截 -->

              /InsertUser = authc,roles[admin]

              /deleteUser = authc,role[admin]

              /logOut = authc

              /** = authc

           </value>

       </property>

</bean>

注意黄色标记的,定义的entry里的key要和下面的过滤器名称相同,不然自定义过滤器就不会执行

3,另外还有一点遇到的问题

@RequiresRoles("admin")

       @RequestMapping("deleteUser")

       public void deleteUser(HttpServletResponse response,User user) {

              response.setCharacterEncoding("UTF-8");

                     int result = userService.deleteUser(user);

                     Message message = new Message();

                     if(result == 1){

                            message.setFlag(1);

                            message.setMessage(Answer.OK);

                     }else {

                            message.setFlag(0);

                            message.setMessage(Answer.ERROR);

                     }

                     try {

                            response.getWriter().print(JSONObject.toJSON(message));

                     } catch (IOException e) {

                            // TODO Auto-generated catch block

                            e.printStackTrace();

                     }

       }

在ajax请求返回数据时,不能用@ResponseBody标签返回对象,必须要用response.getWriter().print()响应给js,不然就会出现后台逻辑实现完成了,但是ajax进不了success,就会出现404


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值