社区
Web 开发
帖子详情
被shiro拦截的请求
chanchaw
2018-12-01 11:30:29
前端发送的请求被shiro拦截的时机是什么时候?
我在类LoginController中的方法isLogined()的第一行使用了打印(system.out.println)
然后从前端发送一个没有权限的请求,结果方法isLogined()的第一行都没有打印
当把该请求从拦截器的策略队列中移除后,是可以进入这个方法的
这么说来,没有权限的请求都不会进入控制器的方法内?
那前端如何得知请求的不成功是由于没有权限还是程序出错?
...全文
506
3
打赏
收藏
被shiro拦截的请求
前端发送的请求被shiro拦截的时机是什么时候? 我在类LoginController中的方法isLogined()的第一行使用了打印(system.out.println) 然后从前端发送一个没有权限的请求,结果方法isLogined()的第一行都没有打印 当把该请求从拦截器的策略队列中移除后,是可以进入这个方法的 这么说来,没有权限的请求都不会进入控制器的方法内? 那前端如何得知请求的不成功是由于没有权限还是程序出错?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
感谢回复,自己测试下看
如何放开
Shiro
对OPTIONS
请求
的
拦截
前台访问后端接口预
请求
时,因OPTIONS
请求
未带token,
Shiro
将其判定为未登录,重定向到登录地址。解决办法是放开
Shiro
对所有OPTIONS
请求
的
拦截
,先确定后端配置好跨域,再建立
Shiro
UserFilter,在
Shiro
Config中对authc做自定义
拦截
配置。
shiro
拦截
未登录的ajax_
shiro
拦截
器实现session过期
拦截
ajax
请求
的处理
本文介绍了使用
Shiro
拦截
未登录的Ajax
请求
的实现方法。给出了自定义
拦截
器代码,用于处理Session过期的AJAX
请求
,返回403状态码。还展示了前台页面全局处理的JS片段,对返回状态码为403的情况进行跳转处理,同时给出了Ajax
请求
的JS示例,最后提到
Shiro
配置需将session
拦截
器放登录
拦截
器前。
Shiro
拦截
ajax
请求
本文介绍了一个问题,即
Shiro
的默认
拦截
器无法
拦截
Ajax
请求
,解决方案是创建一个自定义的AjaxFilter。该过滤器通过检查
请求
头中的X-Requested-With字段来识别Ajax
请求
,并进行权限验证。如果用户未认证,
请求
会被
拦截
并引导至登录页面。配置文件中需添加自定义
拦截
器的设置,以确保Ajax操作受到
Shiro
的保护。
Web 开发
81,111
社区成员
341,722
社区内容
发帖
与我相关
我的任务
Web 开发
Java Web 开发
复制链接
扫一扫
分享
社区描述
Java Web 开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章