具体的なコードは次のよう:
java.lang.annotation.Documentedインポート、 インポートjava.lang.annotation.ElementType; インポートjava.lang.annotation.Retention; インポートjava.lang.annotation.RetentionPolicy; インポートjava.lang.annotation.Target; / ** *注釈この注釈付きコントローラは、ログインする必要がない 小さな尼寺間@author地上の混乱* * * / ノートはJavaDocを処理するかどうかを示し、文書内に残る@Documented // @Target({ElementType.METHOD、ElementType.TYPE}) // 使用されるローカル注釈 @Retention(RetentionPolicy.RUNTIME)//ソース保持レベル パブリック@interfaceのNOLOGIN { }
CheckLoginInterceptor:
インポートのjavax.servlet.http.HttpServletRequest; インポートのjavax.servlet.http.HttpServletResponse; 輸入org.apache.log4j.Logger。 輸入org.springframework.web.method.HandlerMethod; 輸入org.springframework.web.servlet.HandlerInterceptor。 輸入org.springframework.web.servlet.ModelAndView。 パブリッククラスCheckLoginInterceptorはHandlerInterceptor {実装 プライベート静的最終ロガーロガー= Logger.getLogger(CheckLoginInterceptor.class)を、 @Override パブリックブールpreHandle(HttpServletRequestのリクエスト、HttpServletResponseの応答、オブジェクト・ハンドラ)が 例外{スロー // TODO自動生成方法スタブを (HandlerMethodのinstanceof!(ハンドラ))場合には{ logger.warn( "当前操作ハンドラ不为HandlerMethod =" + handler.getClass()のgetName()+ "REQ =" + request.getQueryString())。 trueを返します。 } HandlerMethod handlerMethod =(HandlerMethod)ハンドラ。 文字列methodNameの= handlerMethod.getMethod()のgetName()。 。NOLOGIN NOLOGIN = handlerMethod.getMethod()getAnnotation(NoLogin.class)。 IF(!= NULL NOLOGIN){ logger.info( "当前访问methodNameの=" + methodNameの+ "不需要登陆")。 System.out.println( "当前访问methodNameの=" + methodNameの+ "不需要登陆")。 trueを返します。 } NOLOGIN = handlerMethod.getMethod()のgetDeclaringClass()getAnnotation(NoLogin.class)。 (ヌル!= NOLOGIN){場合 「(logger.info のSystem.out.println(」 trueを返すように; } //認証要求は、セッションを含ん (でrequest.getSession == NULL()){IF logger.info( "現在のアクセスmethodNameの=" + methodNameの+ "ユーザーがログインしていないIPは=" + request.getRemoteAddr( )); System.out.printlnは( "現在のアクセスmethodNameの=" + methodNameの+ "ユーザでログインしていない、IP =" + request.getRemoteAddr()); falseを返す; } logger.info( "現在のアクセスmethodNameの=" + methodNameの+) "ログインする必要があります"; System.out.printlnは( "現在のアクセスmethodNameに=" + methodNameの+) "にログインする必要があります"; falseを返す; } @Override ます。public void postHandle(リクエストのHttpServletRequest、HttpServletResponseの応答は、ハンドラー、オブジェクト @Overrideオブジェクト・ハンドラ のModelAndViewのModelAndViewは){例外をスロー // TODO自動生成方法スタブ } 公共ボイドafterCompletionは、(HttpServletRequestのリクエスト、HttpServletResponseの応答、オブジェクト・ハンドラは、例外EX)が 例外をスロー{ // TODO自動生成方法スタブ } }
InterceptorConfig:
輸入はjava.util.List; 輸入org.springframework.context.annotation.Configuration。 輸入org.springframework.format.FormatterRegistry。 輸入org.springframework.http.converter.HttpMessageConverter。 輸入org.springframework.validation.MessageCodesResolver; 輸入org.springframework.validation.Validator。 輸入org.springframework.web.method.support.HandlerMethodArgumentResolver; 輸入org.springframework.web.method.support.HandlerMethodReturnValueHandler。 輸入org.springframework.web.servlet.HandlerExceptionResolver; 輸入org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer。 輸入org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer。 輸入org.springframework.web.servlet.config.annotation.CorsRegistry。 輸入org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer。 輸入org.springframework.web.servlet.config.annotation.InterceptorRegistry。 輸入org.springframework.web.servlet.config.annotation.PathMatchConfigurer。 輸入org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry。 輸入org.springframework.web.servlet.config.annotation.ViewControllerRegistry。 輸入org.springframework.web.servlet.config.annotation.ViewResolverRegistry。 輸入org.springframework.web.servlet.config.annotation.WebMvcConfigurer。//也可以继承WebMvcConfigurerAdapter类只重写addInterceptors方法、下面代码比较啰嗦 @Configuration
パブリッククラスInterceptorConfigが実装WebMvcConfigurer { @Override 公共ボイドconfigurePathMatch(PathMatchConfigurer構成器){ // TODO自動生成方法スタブ } @Override 公共ボイドconfigureContentNegotiation(ContentNegotiationConfigurer構成器){ // TODO自動生成方法スタブ } @Override 公共ボイドconfigureAsyncSupport(AsyncSupportConfigurer構成器){ // TODO自動-generated方法スタブ } @Override 公共ボイドconfigureDefaultServletHandling(DefaultServletHandlerConfigurer構成器){ // TODO自動生成方法スタブ } @Override 公共ボイドaddFormatters(FormatterRegistryレジストリ){ // TODO自動生成方法スタブ } @Override ます。public void addInterceptors(InterceptorRegistryレジストリ){ registry.addInterceptor(新CheckLoginInterceptor())addPathPatterns( "/ **")。 } @Override 公共ボイドaddResourceHandlers(ResourceHandlerRegistryレジストリ){ // TODO自動生成方法スタブ } @Override 公共ボイドaddCorsMappings(CorsRegistryレジストリ){ // TODO自動生成方法スタブ } @Override 公共ボイドaddViewControllers(ViewControllerRegistryレジストリ){ / / TODO自動生成方法スタブ } @Override 公共ボイドconfigureViewResolvers(ViewResolverRegistryレジストリ){ // TODO自動生成方法スタブ } @Override 公共ボイドaddArgumentResolvers(一覧<HandlerMethodArgumentResolver> argumentResolvers){ // TODO自動生成方法スタブ } @Override 公共ボイドaddReturnValueHandlers(一覧<HandlerMethodReturnValueHandler> returnValueHandlers){ // TODO自動生成方法スタブ } @Override 公共ボイドconfigureMessageConverters(リスト<HttpMessageConverter <?>>コンバータ){ // TODO自動生成方法スタブ } @Override 公共ボイドextendMessageConverters(一覧<HttpMessageConverter <?>>コンバータ) { // TODO自動生成方法スタブ } @Override 公共ボイドconfigureHandlerExceptionResolvers(リスト<HandlerExceptionResolver>exceptionResolvers){ // TODO自動生成方法スタブ } @Override 公共ボイドextendHandlerExceptionResolvers(一覧<HandlerExceptionResolver> exceptionResolvers){ // TODO自動生成方法スタブ } @Override 公共検証getValidator(){ // TODO自動生成方法スタブ 戻りヌル。 } @Override 公共MessageCodesResolver getMessageCodesResolver(){ // TODO自動生成方法スタブ 戻りヌル。 } }
テストコントローラ:
輸入org.springframework.stereotype.Controller。 輸入org.springframework.web.bind.annotation.GetMapping。 輸入org.springframework.web.bind.annotation.ResponseBody。 @Controller パブリッククラスTestController { @NoLogin @GetMapping( "/ユーザー/ login.htm") @ResponseBody ます。public voidログイン(文字列名、文字列のパスワード){ } @ResponseBody @GetMapping( "/ユーザー/ userInfo.htm") 公共無効getUserInfo(ロングUSERID){ } @NoLogin @ResponseBody @GetMapping( "/ユーザー/のregister.htm") 公共ボイドレジスタ(文字列名、文字列のパスワード){ } }
業績:
2019年6月29日00:17:41.222 INFO 11388 --- [NIO-8001-EXEC-1] www.mxh.com.CheckLoginInterceptor: 現在のアクセスmethodNameの= getUserInfoログインする必要があり 、現在のアクセスをmethodNameの= getUserInfoログインする必要 2019-06- 29 00:17:57.987 INFO 11388 --- [NIO-8001-EXEC-4] www.mxh.com.CheckLoginInterceptor: 現在のアクセスmethodNameの=ログインがログインする必要がない =ログインがログインを必要としない現在のアクセスmethodNameの 2019-06-2900を:27:37.214 INFO 11388 --- [ NIO-8001-EXEC-9] www.mxh.com.CheckLoginInterceptor: 現在のアクセスmethodNameの=レジスタにログインする必要はありません ログインする必要がありません現在のアクセスmethodNameのレジスタ=