`

SpringBoot整合拦截器

 
阅读更多
SpringMVC配置

package com.bjdjjs.configuration;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import com.bjdjjs.interceptor.LogInterceptor;

/**
 * 拦截器配置
 * @author Administrator
 *
 */
@Configuration
public class MyWebMvcConfigurer 
        extends WebMvcConfigurerAdapter {
 
    @Bean
    public LogInterceptor getMyInterceptor(){
        return new LogInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(getMyInterceptor());
        super.addInterceptors(registry);
    }
}


@bean为了注册拦截器,不然调用不了Service


以下为日志管理拦截器
package com.bjdjjs.interceptor;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import com.bjdjjs.domain.AuditLog;
import com.bjdjjs.domain.User;
import com.bjdjjs.enumeration.DelStatusEnum;
import com.bjdjjs.service.log.LogService;


/**
 * 日志拦截器
 * @author Administrator
 *
 */
public class LogInterceptor implements HandlerInterceptor {

	protected static Logger logger = Logger.getLogger(LogInterceptor.class);
	
	@Autowired
	private LogService logService;
	
	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		return true;
	}

	@Override
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
	}

	@Override
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		if (handler instanceof HandlerMethod) {
			HandlerMethod handlerMethod = (HandlerMethod) handler;
			Method method = handlerMethod.getMethod();
			AuditLog annotation = method.getAnnotation(AuditLog.class);

			// 判断请求是否配置为进行日志记录
			if (annotation != null) {
				Map<String, Object> param = new HashMap<String, Object>();
				//获取用户信息
				User user = (User) SecurityUtils.getSubject().getPrincipal();
		    	int userId = user.getId();
				String userName = user.getName();

				//获取操作对象
				String operObj = annotation.operObj();
				//获取操作类型
				String operType = annotation.operType();
				
				//获取用户ip地址
				String ipAdress = getRequestIp(request);
				
				//获取操作描述
				String operDesc = annotation.operDesc();
				if(!StringUtils.isBlank(operDesc))
					param.put("operDesc", operDesc);
				
				//状态码
				param.put("status", response.getStatus());
				
				param.put("userId", userId);
				param.put("userName", userName);
				param.put("ipAdress", ipAdress);
				param.put("operObj", operObj);
				param.put("operType", operType);
				
				param.put("isDel", DelStatusEnum.DEFAULT.getValue());
				
				logService.save(param);
				
			}	
		}
	}
	
	/***
     * 获取当前登录用户的IP地址
     * @param request
     */
    private String  getRequestIp(HttpServletRequest request ){
    
    	String ip = request.getHeader("X-Real-IP");
    	if (!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {
    		System.out.println("*******************************X-Real-IP"+ip+"*******************************");
			return ip;
		}
    	
    	ip = request.getHeader("X-Forwarded-For");
		if (!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {
			// 多次反向代理后会有多个IP值,第一个为真实IP。
			System.out.println("*******************************X-Forwarded-For"+ip+"*******************************");
			int index = ip.indexOf(',');
			if (index != -1) {
				return ip.substring(0, index);
			} else {
				return ip;
			}
		} else {
			System.out.println("*******************************getRemoteAddr"+request.getRemoteAddr()+"*******************************");
			return request.getRemoteAddr();
		}
    }
}


其中AuditLog为自定义注解
package com.bjdjjs.domain;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AuditLog {

	/**
	 * 操作对象
	 * 
	 * @return
	 */
	String operObj();

	/**
	 * 操作类型
	 * 
	 * @return
	 */
	String operType();

	/**
	 * 操作描述
	 * 
	 * @return
	 */
	String operDesc() default "";

}


将注解添加到必要的方法上,传入必要的参数即可
分享到:
评论

相关推荐

    SpringBoot整合Mybatis完整详细版含注册、登录、拦截器配置

    在本项目中,我们主要探讨的是如何将SpringBoot与Mybatis进行深度整合,并实现完整的注册、登录功能,以及设置拦截器来控制权限访问。SpringBoot以其简洁的配置和快速的开发能力,配合Mybatis的灵活数据库操作,可以...

    Springboot拦截器+http的4中请求小demo

    Spring Boot整合了Spring MVC,因此我们可以利用Spring MVC的拦截器来实现各种功能,如权限验证、日志记录、性能监控等。本文将详细介绍如何在Spring Boot中设置拦截器,并通过四个基本的HTTP请求方法(PUT、DELETE...

    练习springboot-redisdemo添加了拦截器

    在本项目 "springboot-redisdemo" 中,我们主要关注的是如何在 SpringBoot 中整合 Redis,以及添加拦截器来增强应用程序的功能。 Redis 是一个开源的、高性能的键值数据库,适用于数据缓存、消息队列等多种场景。...

    CXF3.0+Spring3.2 自定义拦截器

    1. **CXF拦截器基础**:CXF的拦截器是基于JAX-WS规范的Handler Chain模型,分为In-bound(请求进来时触发)和Out-bound(响应出去时触发)两类。拦截器可以通过在服务配置中指定,或者通过编程方式动态添加。 2. **...

    springBoot完整整合WebService框架CXF示例

    5. **CXF拦截器**:CXF拦截器是处理消息传递过程中的钩子,可以在消息发送前、发送后、接收前、接收后等阶段进行操作。在这个示例中,拦截器用于实现简单的授权校验。你可以定义一个实现了`ClientInterceptor`或`...

    springboot SSM整合

    在SSM整合SpringBoot的过程中,我们通常会涉及到拦截器(Interceptor)、统一异常处理(Global Exception Handling)以及统一对象返回(Uniform Return Object)等关键点。 1. **SSM整合SpringBoot** 在SpringBoot...

    SpringBoot整合SSM框架——最简单示例

    SpringBoot整合SSM框架是将Spring、SpringMVC和MyBatis这三大流行Java开发组件融合到一起,以便简化Web应用的开发流程。...在实际开发中,还可以根据需求加入日志、权限控制、拦截器等功能,进一步完善项目架构。

    SpringBoot整合Dubbo增强版

    在实际使用中,SpringBoot整合Dubbo增强版还可能包含一些额外的特性,如日志监控、性能指标统计、自定义拦截器等,以提升系统的可观察性和扩展性。开发者可以根据项目需求,选择合适的配置和扩展点,充分利用这套...

    13.为CXF与Spring整合发布WebService添加拦截器进行权限控制

    当我们需要在CXF和Spring整合的基础上发布Web服务,并对权限进行控制时,可以利用拦截器来实现这一目标。本文将详细介绍如何为CXF与Spring整合发布WebService添加拦截器进行权限控制。 首先,我们需要理解CXF拦截器...

    SpringBoot整合mybatis配置

    SpringBoot整合Mybatis是现代Java开发中常见的技术组合,它简化了传统的Spring和Mybatis集成过程,让开发者能够快速构建微服务应用。本教程将详细阐述如何实现这一整合,并涵盖关键配置文件`application.properties`...

    springboot整合流行框架Demo

    SpringBoot整合Shiro,可以通过定义ShiroFilterFactoryBean并配置Shiro的路径拦截规则。同时,需要创建自定义的Shiro Realm,实现用户身份验证和权限校验。Shiro Realm连接到你的数据源,如数据库,从中获取用户信息...

    springboot整合Oauth2,GateWay实现网关登录授权验证

    然后,创建资源服务器,配置必要的安全拦截器,以验证OAuth2令牌。此外,我们还需要为用户提供注册和登录界面,处理授权请求和回调。 接下来,Spring Gateway的角色是作为所有微服务的统一入口,它可以对所有请求...

    springboot整合shiro

    Shiro通过Filter Chain定义了各种安全拦截器,例如FormAuthenticationFilter用于处理表单登录,permsFilter处理权限控制等。在SpringBoot中,可以通过WebConfig类来定制过滤器链。 ```java @Configuration @...

    springboot整合mybatis集成分页查询事务配置,页面模板

    - 在SpringBoot中,拦截器可以与Spring MVC的拦截器一起使用,通过`@WebMvcConfigurer`或`WebMvcConfigurerAdapter`实现。 4. **分页查询**: - MyBatis提供了PageHelper插件来实现分页查询,它简化了分页逻辑。...

    SpringBoot 整合Mybatis 创建临时表

    下面我们将详细探讨如何在SpringBoot项目中整合Mybatis,以实现创建临时表的功能。 首先,我们需要在SpringBoot项目中引入Mybatis的相关依赖。在`pom.xml`文件中,添加如下Mybatis和其Spring Boot Starter的依赖: ...

    springboot专栏 010 springboot整合mybatis-plus 登录页面和首页不拦截

    总结起来,本文主要讲解了如何在Spring Boot项目中整合Mybatis-Plus,并利用拦截器和令牌技术实现登录和首页的无拦截访问。理解这些概念和技术对于开发安全、高效的Web应用至关重要。通过对给定的代码和配置进行学习...

    玩转SpringBoot2快速整合拦截器的方法

    在SpringBoot2中整合拦截器是开发Web应用程序时的一项基础操作,它可以帮助我们对进入系统的请求进行预处理或者后处理。拦截器(HandlerInterceptor)允许我们在请求到达具体的Controller处理之前或者之后,以及完成...

    springboot整合mybatis

    在IT行业中,Spring Boot和MyBatis是两个非常重要的框架,Spring Boot简化了Spring应用程序的初始设置和配置,而...在实际项目中,还可以根据需求添加拦截器、缓存、日志等更多功能,进一步提升应用性能和可扩展性。

    SpringBoot Druid整合,SpringBoot 集成Druid

    在实际开发中,根据项目需求,还可以进一步定制Druid的配置,比如添加数据源的动态切换、SQL拦截器等功能,以满足更加复杂的需求。同时,对于大型项目,Druid的监控功能更是不可或缺的一部分,它可以帮助我们及时...

Global site tag (gtag.js) - Google Analytics