栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

shiro 结合spring Aop记录用户注销的日志分享

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

shiro 结合spring Aop记录用户注销的日志分享


需求:在不影响原来项目的基础上开发一个日志记录插件记录用户操作日志

场景:原项目中使用shiro对用户进行认证和管理,在不影响原来项目的基础上开发一个日志记录插件使用aop记录用户操作日志时,原来项目没有注销的接口(即没有退出的controller)而是通过shiro默认的过滤器实现的退出。

遇到的问题:如何记录用户退出日志

方法:重写shiro的登出过滤器中LogoutFilter中preHandle方法

具体实现:

package com.gisquest.platform.filter;

import java.util.Date;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import org.apache.shiro.session.SessionException;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authc.LogoutFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import com.gisquest.platform.aspect.ModulesDesc;
import com.gisquest.platform.common.CommonUtils;
import com.gisquest.platform.common.Constants;
import com.gisquest.platform.common.config.Global;
import com.gisquest.platform.modules.logmgr.vo.SystemLog;

@Service
public class CustomLogoutFilter extends  LogoutFilter{
	
	private static final Logger log = LoggerFactory.getLogger(CustomLogoutFilter.class);
	
    @Override
    public  boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {
        Subject subject = getSubject(request, response);
        String redirectUrl = getRedirectUrl(request, response, subject);
        //记录登出日志 
        SystemLog systemLog = new SystemLog();
        try {
	        // 设置项目名称
	        String projectName=Global.getConfig("projectName");
	        systemLog.setProjectName(projectName);
	        // 设置业务系统名称
	        String applicationName=Global.getConfig("applicationName");
	        systemLog.setApplicationName(applicationName);
	        // 使用登陆用户名
	        HttpServletRequest request1 =(HttpServletRequest)request ;
	    	String userName = request1.getSession().getAttribute("username_") + "";
	        systemLog.setSrcUserName(userName);
	        // 设置IP
	        systemLog.setSrcAddress(CommonUtils.getIpAddress(request1));
	        //设置地理位置
	        systemLog.setStartTime(Constants.DATEFORMATE.format(new Date()));
	        systemLog.setSrcGeoAddressName(Constants.DQM);
	        systemLog.setDvcAction("注销登陆");
	        systemLog.setOpResult("成功");
            subject.logout();
        } catch (SessionException ise) {
            log.debug("Encountered session exception during logout.  This can generally safely be ignored.", ise);
            systemLog.setOpResult("失败");
        }
    	ModulesDesc.outPutLogFile(systemLog);
        issueRedirect(request, response, redirectUrl);
        return false;
    }
}

然后将自定义的过滤器放入到ShiroFilterFactoryBean中

	
	
		
		
		
		
            
                
                
                
                
            
        
		
			
		
	
	

注:上述代码只提供一种思路,具体使用的时候注意确保创建的自定义过滤器上的注解@Service能被spring扫描到,业务逻辑按照实际情况添加即可,最后将过滤器放入ShiroFilterFactoryBean

同理记录登录日志的时候也可以通过表单认证过滤器记录用户登录的操作日志,认证通过则跳转到首页,认证不通过则跳转到登陆页面,因此使用shiro可以在表单认证过滤器记录用户登陆信息。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/275629.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号