shiro 多realm 情况下,自定义过滤转发指定的登陆页时遇到记住我失效的解决方案

博主在找不到解决方案后自行琢磨,利用Shiro自身实现“记住我”的特性,让自己编写的过滤器也实现该功能,使页面点击“记住我”生效且互不影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个问题找了好久没找到方案,只能自己琢磨了,既然shiro自己实现了记住我,那么我们自己写的过滤器也可以去实现
代码:
 

/**
 * 扩展FormAuthenticationFilter实现动态改变LoginUrl
 */
public class CustomFormAuthenticationFilter extends FormAuthenticationFilter {
	/**
	 * 重写登录地址
	 */
	/* (non-Javadoc)
	 * @see org.apache.shiro.web.filter.AccessControlFilter#redirectToLogin(javax.servlet.ServletRequest, javax.servlet.ServletResponse)
	 */
	@Override
	protected void redirectToLogin(ServletRequest request, ServletResponse response) throws IOException {
		HttpServletRequest req = (HttpServletRequest) request;

		boolean flag = true;
		Cookie[] cookie = req.getCookies();
		if(cookie!=null) {
			for (Cookie c : cookie) {
				if (c.getName().equals("rememberMe") && c.getValue() != null && !c.getValue().equals("")) {
					flag = false;
				}
			}	
		}		
		String url = req.getRequestURI();//请求链接
		if (flag) {
			if (url.contains("backsystem")) {
				url = "/backsystem/index/tothis"; //管理员登陆页
			} else if (url.contains("webdesk")) {
				url = "/webdesk/login/toWebLogin"; //客户登录页
			} else if (url.contains("appdesk")) {
				url = "/appdesk/appUser/backPrompt";  //app端返回未登陆通知
			}
			WebUtils.issueRedirect(request, response, url); 
		}else {
			//登陆实现 将rememberMe中的用户信息取出来 不能直接赋值给user,原因我也不知道,可能序列化后产生的,因为密码存的是加密的,所以要自定义一个字段存非加密的密码
			Subject subject = SecurityUtils.getSubject();  
			if(subject.isRemembered()==true) {
				Object key = subject.getPrincipal();
				SysUser user = new SysUser();
				try {
					BeanUtils.copyProperties(user, key);
				} catch (Exception e) {
					System.out.println("转换失败!");
				}
				UserToken token = new UserToken(user.getUsername(),user.getStrmsg(), user.getLoginType(), subject.isRemembered());
				subject.login(token);
				WebUtils.issueRedirect(request, response, url.substring(url.indexOf("/",1), url.length()));
			}
		}
	}
}

 

 这样我们页面点击记住我就生效了,各自互不影响

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值