城市直播房产教育博客汽车
投稿投诉
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

SpringBoot访问拦截器HandlerIntercep

7月11日 辞凤阙投稿
  定义拦截器Slf4jComponentpublicclassRememberAuthenticationInterceptorimplementsHandlerInterceptor{AutowiredprivateSysUserServiceuserSOverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{dosomthing。。。SubjectsubjectSecurityUtils。getSubject();if(subject。isAuthenticated()){}Sessionsessionsubject。getSession(true);if(session。getAttribute(SessionConst。USERSESSIONKEY)!null){}if(!subject。isRemembered()){log。warn(未设置记住我,跳转到登录页。。。);response。sendRedirect(request。getContextPath()passportlogin);}try{LonguserIdLong。parseLong(subject。getPrincipal()。toString());UseruseruserService。getByPrimaryKey(userId);UsernamePasswordTokentokennewUsernamePasswordToken(user。getUsername(),PasswordUtil。decrypt(user。getPassword(),user。getUsername()),true);subject。login(token);session。setAttribute(SessionConst。USERSESSIONKEY,user);log。info(〔{}〕已自动登录,user。getUsername());}catch(Exceptione){log。error(自动登录失败,e);response。sendRedirect(request。getContextPath()passportlogin);}}}配置拦截器ConfigurationpublicclassWebMvcConfigimplementsWebMvcConfigurer{AutowiredprivateRememberAuthenticationInterceptorrememberAuthenticationIOverridepublicvoidaddInterceptors(InterceptorRegistryregistry){注册添加拦截器registry。addInterceptor(rememberAuthenticationInterceptor)。excludePathPatterns(passport,error,assets,getKaptcha,websocket,favicon。ico)。addPathPatterns();}}
  完成详解HandlerInterceptor和WebMvcConfigurerHandlerInterceptor简介
  应用场景
  1、日志记录,可以记录请求信息的日志,以便进行信息监控、信息统计等。
  2、权限检查:如登陆检测,进入处理器检测是否登陆,如果没有直接返回到登陆页面。
  3、性能监控:典型的是慢日志。
  拦截器我想大家都并不陌生,最常用的登录拦截、或是权限校验、或是防重复提交、或是根据业务像12306去校验购票时间,总之可以去做很多的事情。
  定义一个Interceptor非常简单方式也有几种,我这里简单列举两种
  1、类要实现Spring的HandlerInterceptor接口
  2、类继承实现了HandlerInterceptor接口的类,例如已经提供的实现了HandlerInterceptor接口的抽象类HandlerInterceptorAdapter2、HandlerInterceptor方法介绍booleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsEvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsEvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsE
  preHandle:在业务处理器处理请求之前被调用。预处理,可以进行编码、安全控制、权限校验等处理;
  postHandle:在业务处理器处理请求执行完成后,生成视图之前执行。后处理(调用了Service并返回ModelAndView,但未进行页面渲染),有机会修改ModelAndView(这个博主就基本不怎么用了);
  afterCompletion:在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。返回处理(已经渲染了页面);
  这样在我们业务中比如要记录系统日志,日志肯定是在afterCompletion之后记录的,否则中途失败了,也记录了,那就扯淡了。一定是程序正常跑完后,我们记录下那些对数据库做个增删改的操作日志进数据库。所以我们只需要继承HandlerInterceptorAdapter,并重写afterCompletion一个方法即可,因为preHandle默认是true。
  运行流程总结如下:
  1、拦截器执行顺序是按照Spring配置文件中定义的顺序而定的。
  2、会先按照顺序执行所有拦截器的preHandle方法,一直遇到returnfalse为止,比如第二个preHandle方法是returnfalse,则第三个以及以后所有拦截器都不会执行。若都是returntrue,则按顺序加载完preHandle方法。
  3、然后执行主方法(自己的controller接口),若中间抛出异常,则跟returnfalse效果一致,不会继续执行postHandle,只会倒序执行afterCompletion方法。
  4、在主方法执行完业务逻辑(页面还未渲染数据)时,按倒序执行postHandle方法。若第三个拦截器的preHandle方法returnfalse,则会执行第二个和第一个的postHandle方法和afterCompletion(postHandle都执行完才会执行这个,也就是页面渲染完数据后,执行after进行清理工作)方法。(postHandle和afterCompletion都是倒序执行)
  WebMvcConfigurer简介
  WebMvcConfigurer配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制,可以自定义一些Handler,Interceptor,ViewResolver,MessageConverter。基于javabased方式的springmvc配置,需要创建一个配置类并实现WebMvcConfigurer接口;
  在SpringBoot1。5版本都是靠重写WebMvcConfigurerAdapter的方法来添加自定义拦截器,消息转换器等。SpringBoot2。0后,该类被标记为Deprecated(弃用)。官方推荐直接实现WebMvcConfigurer或者直接继承WebMvcConfigurationSupport,方式一实现WebMvcConfigurer接口(推荐),方式二继承WebMvcConfigurationSupport类WebMvcConfigurer接口publicinterfaceWebMvcConfigurer{voidconfigurePathMatch(PathMatchConfigurervar1);voidconfigureContentNegotiation(ContentNegotiationConfigurervar1);voidconfigureAsyncSupport(AsyncSupportConfigurervar1);voidconfigureDefaultServletHandling(DefaultServletHandlerConfigurervar1);voidaddFormatters(FormatterRegistryvar1);voidaddInterceptors(InterceptorRegistryvar1);voidaddResourceHandlers(ResourceHandlerRegistryvar1);voidaddCorsMappings(CorsRegistryvar1);voidaddViewControllers(ViewControllerRegistryvar1);voidconfigureViewResolvers(ViewResolverRegistryvar1);voidaddArgumentResolvers(ListHandlerMethodArgumentResolvervar1);voidaddReturnValueHandlers(ListHandlerMethodReturnValueHandlervar1);voidconfigureMessageConverters(ListHttpMessageC?var1);voidextendMessageConverters(ListHttpMessageC?var1);voidconfigureHandlerExceptionResolvers(ListHandlerExceptionResolvervar1);voidextendHandlerExceptionResolvers(ListHandlerExceptionResolvervar1);ValidatorgetValidator();MessageCodesResolvergetMessageCodesResolver();}
  其中常用的方法:拦截器配置voidaddInterceptors(InterceptorRegistryvar1);视图跳转控制器voidaddViewControllers(ViewControllerRegistryregistry);静态资源处理voidaddResourceHandlers(ResourceHandlerRegistryregistry);默认静态资源处理器voidconfigureDefaultServletHandling(DefaultServletHandlerConfigurerconfigurer);这里配置视图解析器voidconfigureViewResolvers(ViewResolverRegistryregistry);配置内容裁决的一些选项voidconfigureContentNegotiation(ContentNegotiationConfigurerconfigurer);解决跨域问题publicvoidaddCorsMappings(CorsRegistryregistry);addInterceptors:拦截器(常用)addInterceptor:需要一个实现HandlerInterceptor接口的拦截器实例addPathPatterns:用于设置拦截器的过滤路径规则;addPathPatterns()对所有请求都拦截excludePathPatterns:用于设置不需要拦截的过滤规则拦截器主要用途:进行用户登录状态的拦截,日志的拦截等。OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){super。addInterceptors(registry);registry。addInterceptor(newTestInterceptor())。addPathPatterns()。excludePathPatterns(emptoLogin,emplogin,js,css,images);}addViewControllers:页面跳转
  以前写SpringMVC的时候,如果需要访问一个页面,必须要写Controller类,然后再写一个方法跳转到页面,感觉好麻烦,其实重写WebMvcConfigurer中的addViewControllers方法即可达到效果了OverridepublicvoidaddViewControllers(ViewControllerRegistryregistry){registry。addViewController(toLogin)。setViewName(login);}
  值的指出的是,在这里重写addViewControllers方法,并不会覆盖WebMvcAutoConfiguration(Springboot自动配置)中的addViewControllers(在此方法中,SpringBoot将映射至index。html),这也就意味着自己的配置和SpringBoot的自动配置同时有效,这也是我们推荐添加自己的MVC配置的方式。addResourceHandlers:静态资源
  比如,我们想自定义静态资源映射目录的话,只需重写addResourceHandlers方法即可。
  注:如果继承WebMvcConfigurationSupport类实现配置时必须要重写该方法,具体见其它文章ConfigurationpublicclassMyWebMvcConfigurerAdapterimplementsWebMvcConfigurer{配置静态访问资源paramregistryOverridepublicvoidaddResourceHandlers(ResourceHandlerRegistryregistry){registry。addResourceHandler(my)。addResourceLocations(classpath:my);}}addResoureHandler:指的是对外暴露的访问路径addResourceLocations:指的是内部文件放置的目录configureDefaultServletHandling:默认静态资源处理器
  此时会注册一个默认的Handler:DefaultServletHttpRequestHandler,这个Handler也是用来处理静态文件的,它会尝试映射。当DispatcherServelt映射时(和是有区别的),并且没有找到合适的Handler来处理请求时,就会交给DefaultServletHttpRequestHandler来处理。注意:这里的静态资源是放置在web根目录下,而非WEBINF下。
  可能这里的描述有点不好懂(我自己也这么觉得),所以简单举个例子,例如:在webroot目录下有一个图片:1。png我们知道Servelt规范中web根目录(webroot)下的文件可以直接访问的,但是由于DispatcherServlet配置了映射路径是:,它几乎把所有的请求都拦截了,从而导致1。png访问不到,这时注册一个DefaultServletHttpRequestHandler就可以解决这个问题。其实可以理解为DispatcherServlet破坏了Servlet的一个特性(根目录下的文件可以直接访问),DefaultServletHttpRequestHandler是帮助回归这个特性的。onfigureViewResolvers:视图解析器
  这个方法是用来配置视图解析器的,该方法的参数ViewResolverRegistry是一个注册器,用来注册你想自定义的视图解析器等。ViewResolverRegistry常用的几个方法:配置请求视图映射returnBeanpublicInternalResourceViewResolverresourceViewResolver(){InternalResourceViewResolverinternalResourceViewResolvernewInternalResourceViewResolver();请求视图文件的前缀地址internalResourceViewResolver。setPrefix(WEBINFjsp);请求视图文件的后缀internalResourceViewResolver。setSuffix(。jsp);returninternalResourceViewR}视图配置paramregistryOverridepublicvoidconfigureViewResolvers(ViewResolverRegistryregistry){super。configureViewResolvers(registry);registry。viewResolver(resourceViewResolver());registry。jsp(WEBINFjsp,。jsp);}configureContentNegotiation:配置内容裁决的一些参数addCorsMappings:跨域OverridepublicvoidaddCorsMappings(CorsRegistryregistry){super。addCorsMappings(registry);registry。addMapping(cors)。allowedHeaders()。allowedMethods(POST,GET)。allowedOrigins();}configureMessageConverters:信息转换器消息内容转换配置配置fastJson返回json转换paramconvertersOverridepublicvoidconfigureMessageConverters(ListHttpMessageC?converters){调用父类的配置super。configureMessageConverters(converters);创建fastJson消息转换器FastJsonHttpMessageConverterfastConverternewFastJsonHttpMessageConverter();创建配置类FastJsonConfigfastJsonConfignewFastJsonConfig();修改配置返回内容的过滤fastJsonConfig。setSerializerFeatures(SerializerFeature。DisableCircularReferenceDetect,SerializerFeature。WriteMapNullValue,SerializerFeature。WriteNullStringAsEmpty);fastConverter。setFastJsonConfig(fastJsonConfig);将fastjson添加到视图消息转换器列表内converters。add(fastConverter);}
投诉 评论 转载

最近才明白的40个道理,你明白几个?1。如果家里人文化程度不高,基本没出过远门,那他们所谓的经验我们听听就好。2。钱能解决90的烦恼,另外的10还可以用钱来延缓。3。善良可以有,但千万别让你的善良太廉……谭咏麟丑闻发酵第三天爆料人高调发文挑衅,谭仍然选择沉默谭咏麟在爆料人接二连三的发文后,只有在第一天的时候选择了一则公司声明,接着就选择沉默的方式对待了。一部分网友随着谭方的一则声明选择性的相信了,直指该网友是造谣,自己的偶像……SpringBoot访问拦截器HandlerIntercep定义拦截器Slf4jComponentpublicclassRememberAuthenticationInterceptorimplementsHandlerIntercep……河南烙馍卷菜烙馍卷菜是河南登封的著名的汉族面食小吃之一,其做法既简单,又好吃,倍受食客的青睐。面粉最好用石磨面,不含任何添加剂,吃起来筋道有嚼头,细品余味香甜。所谓甜,是面粉本身的味道。如……钉钉也换logo了?这次花了多少钱,钱给我,我也能改又又双叕。。。有大厂换logo了!这些年不断有大厂换logo我们也是喜闻乐见的在找不同阿里钉钉7年首次更新LOGO,网友:翅膀硬了然后部分网友开始……北京冬奥开幕倒计时40天,景海鹏武大靖现身嘉年华今天是北京2022年冬奥会开幕倒计时40天,上午,带动三亿人参与冰雪运动示范活动在石景山区冬奥社区举行。景海鹏、高凤林等各行各业优秀代表及叶乔波、申雪、王一博、杨倩等文体界代表……水槽洗碗机,使用方便,还省地方,为什么很少人买?来听听大实话洗碗机在近几年变得非常流行,越来越多的家庭会在家里买上一台洗碗机,毕竟洗碗机可以解放我们的双手,提高我们的生活舒适度。不过,市面上的洗碗机,款式型号众多,很多人都不知道如何选择……再见,c罗随着2022的世界杯渐渐的落下帷幕,葡萄牙在此次世界杯中也惨遭淘汰,c罗也将离开足球运动,他曾是世界上最伟大的足球运动员之一、一位技术无与伦比的运动员2020年他离开皇马,签约……从拿破仑到希特勒,为何都要进攻俄国?逼不得已还是一时冲动?说起俄罗斯,大部分人最直接的印象应该就是彪悍,强硬,领土面积大到吓人。还有一部分人印象比较深刻的应该就是其曾经遭遇过两次来自西欧方面武装势力的进攻了。不知道大家注意到了没……Epic商城15天免费游戏盛宴魂系游戏精髓作盐和避难所玩游戏,就用野豹游戏加速器!畅享流畅稳定加速,体验私人专属独享IPEpic商城15天免费游戏盛宴来袭,将于每天的0点送出一款免费游戏,连续15天。第14天带来的是魂……NBA离奇惨案冠军成员人间蒸发十几年,生不见人死不见尸在1997年,志在卫冕的公牛遇到了不小的麻烦,大虫罗德曼惹事生非,被联盟禁赛,队内中锋郎利一把年纪,再无当年之神勇。芝加哥孱弱的内线就像一层窗户纸,被那些肌肉男肆意蹂躏。关键时……2021年底手机怎么选!这3款最佳机型推荐,帮你只买对的不买双十二马上就要到了,作为年前的最后一波大促,很多手机厂商也推出了降价策略。在这里转转提醒大家选择手机要擦亮眼睛,切记不要被商家割了韭菜!这篇文章转转也为大家总结了2021年三款……
武汉三镇主帅没想过夺冠这一长远目标,战平泰山队结果比较公正一个人最顶级的魅力真诚,清醒,知足远古发现丨我国恐龙蛋研究揭示恐龙灭绝新机制看完69岁胡因梦的穿衣打扮,才明白岁月沉淀的美是装不出来的32,闪击送点2进球被吹世界波制胜,欧洲冠军险胜葡萄牙领跑迪温琴佐库里和追梦在我的签约中发挥了关键作用04,超级惨案!阿根廷被吊打,30分钟丢3球,巴西队主帅跳舞利智总被传为赌王生过一个孩子,可能性有多大最新最全!北京绝美露营地名单(七),建议收藏夏日炎炎难入眠5个禁忌行为不能要世界足坛十大高薪主帅李克勤抛妻弃子?冧庄做导师稳袋8位数酬金,为赚钱有时间都唔翻这些蔬菜不适合微波炉加热哦论次文本对电视节目筹划文本所指意涵的丰盈作用的论文奋斗的名言名句大全发财树怎么修剪枝叶杨闇公:头可断志不可夺教师节征文1000字笑中带泪忆恩师暑假也要给孩子补补“生活课”细分造句用细分造句大全正能量的早安心情语录App耗电分析与优化下雨天,真好学生作文高中三年的毕业留言

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找