精华内容
下载资源
问答
  • Spring拦截器

    2020-12-22 02:02:30
    Spring boot Interceptor工作原理使用场景常用拦截器接口HandlerInterceptor例子工作流程AsyncHandlerInterceptor例子工作流程HandlerInterceptorAdapter例子工作流程WebRequestInterceptor例子工作流程配置拦截器 ...
  • spring拦截器,高级参数绑定,controller返回值
  • 主要介绍了Spring mvc拦截器实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 本篇文章主要介绍了详解Spring AOP 拦截器的基本实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 本篇文章主要介绍了使用spring拦截器实现日志管理实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
  • 本篇文章主要介绍了spring自定义注解实现拦截器的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 基于Spring拦截器实现拦截器注解

    千次阅读 2018-03-03 23:44:09
    需求描述: 对指定资源(方法或者类)进行权限控制。...Spring 4.3.6.RELEASE 实现细节 注解接口 package com.xmasq.framework.core.annotation.permission; import java.lang.annota...

    需求描述:

    对指定资源(方法或者类)进行权限控制。

    解决方案

    在需要权限控制的资源,加上权限控制注解

    软件版本

    • JAVA JDK 1.8
    • Spring 4.3.6.RELEASE

    实现细节

    1. 注解接口
    package com.xmasq.framework.core.annotation.permission;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    import org.springframework.stereotype.Component;
    
    /**
     * 权限控制
     * 
     * @author 艾思祺-非渝
     * @version 1.0.0
     */
    @Component
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ ElementType.METHOD, ElementType.TYPE })
    public @interface Permission {
    
        /** 进行权限过滤的操作类型 用户所拥有的权限集仅需要1项权限符合 */
        public final static String OPER_OR = "OR";
        /** 进行权限过滤的操作类型 用户所拥有的权限集需要覆盖全部 */
        public final static String OPER_AND = "AND";
    
        /**
         * 需求的权限的操作模式,默认为OR
         */
        public String oper() default OPER_OR;
    
        /** 需要的权限 */
        String[] value() default {};
    
    }

    2.对注解的实现进行一层封装,方便其它注解实现

    package com.xmasq.framework.core.annotation;
    
    import java.lang.annotation.Annotation;
    
    import org.springframework.core.annotation.AnnotationUtils;
    import org.springframework.util.ClassUtils;
    import org.springframework.web.method.HandlerMethod;
    import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
    
    /**
     * 注解处理器的简单封装,可以简单获取指定注解
     * 
     * @author 艾思祺-非渝
     * @version 1.0.0
     */
    public abstract class BaseAnnotationHandler<T extends Annotation> extends HandlerInterceptorAdapter {
    
        /**
         * 获取指定注解
         * 
         * @param handler
         * @return
         */
        public T getAnnotation(Object handler, Class<T> annotationClass) {
            if (handler instanceof HandlerMethod) {
                T annotation = null;
                HandlerMethod handlerMethod = (HandlerMethod) handler;
                annotation = handlerMethod.getMethodAnnotation(annotationClass);
                if (annotation == null) {
                    annotation = AnnotationUtils.findAnnotation(handlerMethod.getBeanType(), annotationClass);
                }
                return annotation;
            } else {
                return AnnotationUtils.findAnnotation(ClassUtils.getUserClass(handler), annotationClass);
            }
        }
    
    }

    3.Permission注解的具体实现

    package com.xmasq.framework.core.annotation.permission;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.stereotype.Component;
    import org.springframework.web.servlet.ModelAndView;
    
    import com.xmasq.framework.core.annotation.BaseAnnotationHandler;
    import com.xmasq.framework.core.exception.BusinessException;
    import com.xmasq.framework.module.user.UserContext;
    import com.xmasq.framework.module.user.UserContextHelper;
    
    /**
     * Promission注解的处理
     * 
     * @see com.xmasq.framework.core.annotation.permission.Permission
     * 
     * @author 艾思祺-非渝
     * @version 1.0.0
     */
    @Component
    public class PermissionHandler extends BaseAnnotationHandler<Permission> {
    
        public static final String BEAN_NAME = "promissionInterceptor";
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                throws Exception {
            Permission promission = getAnnotation(handler, Permission.class);
            // 具体实现细节
        }
    
        @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 {
    
        }
    
    }
    

    4.使用方式

    @Permission(value = {"p_menu_view"})
    @RestController
    @RequestMapping(value = "/manage/menu")
    public class MenuRestController extends BaseRestController {
    
        @Autowired
        private MenuService menuService;
    
        @Permission(value = {"p_menu_edit"})
        @PostMapping(value = "/save")
        public AjaxResponse save(@RequestBody Menu menu) {
            menuService.saveMenu(menu);
            return AjaxResponse.success();
        }
    }

    PS:关于获取注解,如果运用在类上,必须要要对注解加上spring的@Component注解,这样才能通过AnnotationUtils.findAnnotation(handlerMethod.getBeanType(), annotationClass);获取到指定注解

    展开全文
  • 主要介绍了Spring Boot配置拦截器及实现跨域访问的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 主要介绍了Spring MVC 拦截器 interceptor 用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • springboot的拦截器也是对请求进行的系列验证或处理,关于拦截器和过滤器的区别此文不做介绍,详细可阅读:拦截器与过滤器的区别,下面说一下SSM项目中自定义拦截器的实现。 二、自定义拦截器类,写一个类实现...

    一、前言

    Spring和SpringBoot的拦截器也是对请求进行的系列验证或处理,关于拦截器和过滤器的区别此文不做介绍,之前我看到过一篇相关系列的文章,讲述的还比较详细,给大家参考参考:拦截器与过滤器的区别,下面说一下SSM项目中自定义拦截器的实现。

    二、自定义拦截器

    自定义拦截器类,写一个类实现 HandlerInterceptor 接口,然后重写 里面的 preHandle()、postHandle()、afterCompletion()方法

    // return  true表示放行,  return false表示拦截,不向下执行
    public class Interceptor1 implements HandlerInterceptor{
    
    	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
    	
    		log.info("preHandle:请求前调用");
               //返回 false 则请求中断
    		//判断用户是否登陆  如果没有登陆  重定向到登陆页面   不放行   如果登陆了  就放行了
    		String requestURI = request.getRequestURI();
    		if(!requestURI.contains("/login")){
    			String username = (String) request.getSession().getAttribute("USER_SESSION");
    			if(null == username){
    				response.sendRedirect(request.getContextPath() + "/login.action");
    				return false;
    			}
    		}
    		return true;
    	}
    
              /** 
              * 在业务处理器处理请求执行完成后,生成视图之前执行的动作    
              * 可在modelAndView中加入数据,比如当前时间 
              */  
    	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView modelAndView)
    			throws Exception {
    		  if(modelAndView != null){  //加入当前时间    
                modelAndView.addObject("var", "测试postHandle");    
              }  
    		log.info("postHandle:请求后调用");	
    	}
          
           /**  
           * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等   
           *   
           * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()  
           */    
    	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
    			throws Exception {
    		 log.info("afterCompletion:请求调用完成后回调方法,即在视图渲染完成后回调");
    	}
    
    }
    

     preHandle
    预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器(如具体的Controller实现); 
    返回值:true表示继续流程(如调用下一个拦截器或处理器);false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;

    postHandle
    后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。

    afterCompletion
    整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器的afterCompletion。

    preHandle

    • 调用时间:Controller方法处理之前
    • 执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序一个接一个执行
    • 若返回false,则中断执行,注意:不会进入afterCompletion

     

    postHandle

    • 调用前提:preHandle返回true
    • 调用时间:Controller方法处理完之后,DispatcherServlet进行视图的渲染之前,也就是说在这个方法中你可以对ModelAndView进行操作
    • 执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序倒着执行
    • 备注:postHandle虽然post打头,但post、get方法都能处理

    afterCompletion

    • 调用前提:preHandle返回true
    • 调用时间:DispatcherServlet进行视图的渲染之后
    • 多用于清理资源

     

     

    三、springmvc.xml装在拦截器配置

      在springmvc的xml配置文件中, 来构建拦截器, 拦截上面的controller

         <!-- Springmvc的拦截器 -->
    	<mvc:interceptors>
    		<!-- 多个拦截器 -->
    		<mvc:interceptor>  
                     <!-- 具体匹配原则可以百度 -->
                     <!-- 对controller的请求url路径进行拦截,匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->   
    				   /**的意思是所有文件夹及里面的子文件夹 
    				   /*是所有文件夹,不含子文件夹
    				   /是web项目的根目录 -->
    		      <mvc:mapping path="/**"/>
    		      <!-- 自定义的拦截器类 -->
    		      <bean class="com.iss.springmvc.interceptor.Interceptor1"/>
    		</mvc:interceptor>
    	</mvc:interceptors>
    

    四、更多好文

    SpringMVC拦截器的使用详解:https://blog.csdn.net/xiaokang123456kao/article/details/72831049
     

    展开全文
  • 使用spring拦截器 拦截转发到内部controller报500错误 重定向到外部路径可以 重定向到内部controller页面显示重定向过多 以上情况不用拦截器都可以运行 我觉得应该有个循环在里面 拦截器是拦截controller的, 拦截了...

    重定向过多

    使用spring拦截器 拦截转发到内部controller报500错误
    重定向到外部路径可以
    重定向到内部controller页面显示重定向过多

    以上情况不用拦截器都可以运行

    我觉得应该有个循环在里面

    拦截器是拦截controller的, 拦截了controller后又重定向或者转发到controller, 又是拦截, 死循环重定向或者转发

    如果需要拦截转发或者重定向的话,在拦截器中配置忽略拦截的路径
    在这里插入图片描述

    展开全文
  • 本篇文章主要介绍了使用Spring MVC拦截器实现日志记录的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 主要介绍了Spring拦截器HandlerInterceptor接口代码解析,具有一定借鉴价值,需要的朋友可以参考下
  • spring拦截器 拦截和排除接口冲突

    千次阅读 2019-09-15 22:38:46
    场景: 某个规则下的绝大部分接口路径不需要经过拦截器, 但其中的某几个接口又需要经过拦截器. 例如: "/api/register/**" 模式匹配的路径下绝大部分接口不需要登录, 但是其中"/api/register/logout"接口又需要登录...

    以下为springboot案例: 

    场景:  某个规则下的绝大部分接口路径不需要经过拦截器, 但其中的某几个接口又需要经过拦截器.

    例如: "/api/register/**" 模式匹配的路径下绝大部分接口不需要登录, 但是其中"/api/register/logout"接口又需要登录(暂不要考虑为啥, 仅仅是做样例)

    下意识反应的可能操作是: 

    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor) // loginInterceptor 登陆拦截器
            .addPathPatterns("/**") // 1. 拦截所有接口路径 
            .excludePathPatterns("/api/register/**") // 2. 不拦截器"/api/register/"下的所有接口
            .addPathPatterns("/api/register/logout"); // 3. 拦截"/api/register/logout"接口路径(为了覆盖2步骤中全部拦截)
    }

    但遗憾的是发现如上配置并不能生效, 当我们尝试将3的配置写到1的地方, 或者放在1,2之间 依旧不能生效. 

    正确的做法是在调用一个addInterceptor方法(即: 在添加一个拦截器配置), 如下

    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor) // loginInterceptor 登陆拦截器
            .addPathPatterns("/**") // 1. 拦截所有接口路径 
            .excludePathPatterns("/api/register/**"); // 2. 不拦截器"/api/register/"下的所有接口
            
    // 再创建一个拦截器, 对该特定接口拦截, 只不过这个拦截器和上面的拦截器业务代码一样
    registry.addInterceptor(loginInterceptor) // loginInterceptor 登陆拦截器
            .addPathPatterns("/api/register/logout"); // 3. 拦截"/api/register/logout"接口路径(为了覆盖2步骤中全部拦截)
    }

    为什么这么做可以?

    我们看registry.addInterceptor会根据入参new一个InterceptorRegistration, 即每一次addInterceptor都是一个新的对象. 这不是和我们声明不同的拦截器, 拦截不同的路径一个道理吗? 只不过这里的两个拦截器的业务是一样的, 如果可以, 你完全可以声明两个拦截器, 但他们的业务逻辑完全一致, 然后用于以上代码中. 

    如下为addInterceptor的内部实现:

    // 所在类全限定名org.springframework.web.servlet.config.annotation.InterceptorRegistry#addInterceptor
    // interceptor 为 registry.addInterceptor(loginInterceptor)的入参
    public InterceptorRegistration addInterceptor(HandlerInterceptor interceptor) {
        InterceptorRegistration registration = new InterceptorRegistration(interceptor);
        this.registrations.add(registration);
        return registration;
    }

     

    展开全文
  • spring拦截器的两种实现方式

    千次阅读 2019-10-04 11:16:51
    方式一:实现 HandlerInterceptor接口,实现接口内的方法 public class LoginInterceptor ... //执行控制之前的拦截程序 public boolean preHandle(HttpServletRequest request, HttpServletResponse response...
  • spring mvc 拦截器获取请求数据信息 解压之后放到项目中 直接运行就可以了 (将流多次运用)
  • spring boot简单应用,配置yml文件,实现mysql数据库的连接,对数据进行增删改查,另有登录拦截器
  • 10.Spring拦截器是什么及其使用

    千次阅读 2018-05-03 17:49:05
    Spring中使用Interceptor拦截器 SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理。比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像...
  • spring 拦截器拦截所有的请求

    千次阅读 2019-09-25 14:14:47
    <mvc:interceptor> <mvc:mapping path="/**"/> <ref bean="_DotnetTicketLoginContextInterceptor"/> </mvc:interceptor>...mapping path配置两个*, 否则拦截不住子目录 , 如/...
  • 一.前言 由于业务需要,在网上找了很久得到了这两种方式。本文代码偏少,主要讲解一下怎么传,如何接收,也记录一下,以便之后...二.Spring拦截器传递参数到controller 三.Aop切面传递参数到目标方法 四.总结 ...
  • spring拦截器

    2019-05-25 21:11:37
    spring拦截器实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter类都可以实现,主要有三个方法,preHandle在调用具体的controller之前执行,postHandle在调用controller之后,但是页面渲染之前执行,...
  • 这篇文章是我们企业开发实战篇应用spring拦截器的第二篇文章,第一篇《解决跨域问题》,该篇文章我们主要讲解下如何使用拦截器+自定义注解来实现登录鉴权校验的功能,关于拦截器和自定义注解的基础语法下面也会稍带...
  • Servlet的过滤器与Spring拦截器详解

    千次阅读 2017-06-07 13:42:18
    第一部分:过滤Filter一:Filter简介Servlet API中提供了一个javax.servlet.Filter接口,开发web应用时,实现了这个接口的Java类,则把这个java类称之为过滤Filter。通过Filter技术,开发人员可以实现用户在访问...
  • Spring 拦截器拦截了swagger-ui处理方法

    千次阅读 2018-12-12 16:50:44
    Spring 拦截器拦截了swagger-ui处理方法 我们F12查看swagger-ui资源有这些: 得到他们对应的url 我们在拦截器的配置文件里面设置: &lt;mvc:exclude-mapping path="/swagger-resources/**"/&gt;&...
  • 拦截器定义完成后,不配置是不起作用的,传统的spring项目通过XML文件配置,spring—boot是为了实现无XML配置,所以可以通过如下方式添加, @Configuration public class WebAppConfig extends org.spring...
  • 我在使用spring拦截器的时候,出现了乱码,经过google,找到了解决办法,特此发过来让大家共享哦
  • 拦截器是基于java的反射机制的,而过滤器是基于函数回调。 ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。 ③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。 ④拦截器可以...
  • Spring 拦截器(Interceptor )的使用

    千次阅读 2019-06-09 21:35:07
    执行位置不同: 过滤器,拦截器: 一个是在要进入Servlet之前进行过滤。一个是在请求到达DispacherServlet后,在DispacherServlet调用某个Controller类执行
  • Spring拦截器进行登录拦截

    千次阅读 2017-09-18 13:49:04
    拦截器: public class LoginInterceptor implements HandlerInterceptor{ private static final Log log = LogFactory.getLog(LoginInterceptor.class); @Override public void afterCo
  • NULL 博文链接:https://hw1287789687.iteye.com/blog/2046621

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 181,382
精华内容 72,552
关键字:

spring拦截器

spring 订阅