被shiro拦截的请求

chanchaw 2018-12-01 11:30:29
前端发送的请求被shiro拦截的时机是什么时候?
我在类LoginController中的方法isLogined()的第一行使用了打印(system.out.println)
然后从前端发送一个没有权限的请求,结果方法isLogined()的第一行都没有打印
当把该请求从拦截器的策略队列中移除后,是可以进入这个方法的
这么说来,没有权限的请求都不会进入控制器的方法内?
那前端如何得知请求的不成功是由于没有权限还是程序出错?
...全文
443 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dark_Zhou 2018-12-02
  • 打赏
  • 举报
回复
shiro的拦截是执行不到方法的,和过滤器是一个效果。你可以通过shiro的配置自定义一个未登陆的拦截路径 // 未授权界面; shiroFilterFactoryBean.setUnauthorizedUrl(ShiroConstant.UNAUTHORIZED_URL); 然后自己重写这个路径下的逻辑,类似这样 /** * 无登录权限时跳转,配合ajax请求使用 * @Author: ZZ * @Date: 2018/11/14 15:39 * @return */ @ResponseBody @RequestMapping("/noAuthc") public ResultInfo noAuthc(HttpServletResponse response){ response.setHeader("sessionStatus", "noAuthc"); return ResultInfo.failure(); } 前端可以这样判断 //判断是否登录 $.ajaxSetup({ contentType:"application/x-www-form-urlencoded;charset=utf-8", complete:function(XMLHttpRequest,textStatus){ var sessionstatus = XMLHttpRequest.getResponseHeader("sessionStatus"); if(sessionstatus=="noAuthc"){ window.location.replace("/login"); } } }); 具体逻辑可以自己编写,这里只是一个实现思路,应该能满足你的要求
小码哥学习中 2018-12-02
  • 打赏
  • 举报
回复
给你一段测试代码参考一下:
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class ShiroTest {
    private static final transient Logger log =
            LoggerFactory.getLogger(ShiroTest.class);

    public static void main(String[] args) {
        //1. 这里的SecurityManager是org.apache.shiro.mgt.SecurityManager
        // 而不是java.lang.SecurityManager
        // 加载配置文件
        Factory<SecurityManager> factory =
                new IniSecurityManagerFactory("classpath:shiro.ini");
        //2.解析配置文件,并且返回一些SecurityManger实例
        SecurityManager securityManager = factory.getInstance();
        //3.将SecurityManager绑定给SecurityUtils
        SecurityUtils.setSecurityManager(securityManager);
        // 安全操作,Subject是当前登录的用户
        Subject currentUser = SecurityUtils.getSubject();

        // 测试在应用的当前会话中设置属性
        Session session = currentUser.getSession();
        //放进去一个key和一个value
        session.setAttribute("someKey", "aValue");
        //根据key拿到value
        String value = (String) session.getAttribute("someKey");
        if ("aValue".equals(value)) {//比较拿到的值和原来的值是否一致
            log.info("检索到正确的值[" + value + "]");
        }
        //尝试进行登录用户,如果登录失败了,我们进行一些处理
        if (!currentUser.isAuthenticated()) {//如果用户没有登录过
            //new UsernamePasswordToken(用户名,密码)
            UsernamePasswordToken token =
                    new UsernamePasswordToken("test", "123456");
            token.setRememberMe(true);//是否记住用户
            try {
                currentUser.login(token);
                //当我们获登录用户之后
                log.info("用户 [" + currentUser.getPrincipal() + "] 登陆成功");
                // 查看用户是否有指定的角色
                if (currentUser.hasRole("admin")) {
                    log.info("您有admin角色");
                } else {
                    log.info("您没有admin角色");
                }
                if (currentUser.hasRole("role1")) {
                    log.info("您有role1角色");
                } else {
                    log.info("您没有role1角色");
                }

                // 查看用户是否有某个权限
                if (currentUser.isPermitted("perm1")) {
                    log.info("您有perm1权限");
                } else {
                    log.info("您没有perm1权限");
                }
                if (currentUser.isPermitted("guest")) {
                    log.info("您有guest权限");
                } else {
                    log.info("您没有guest权限");
                }
                //登出
                currentUser.logout();
            } catch (UnknownAccountException uae) {
                log.info(token.getPrincipal() + "账户不存在");
            } catch (IncorrectCredentialsException ice) {
                log.info(token.getPrincipal() + "密码不正确");
            } catch (LockedAccountException lae) {
                log.info(token.getPrincipal() + "用户被锁定了 ");
            } catch (AuthenticationException ae) {
                //无法判断是什么错了
                log.info(ae.getMessage());
            }
        }
    }
}



chanchaw 2018-12-02
  • 打赏
  • 举报
回复
感谢回复,自己测试下看

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧