具体代码如下:
import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 标注此注解的controller不需要登陆 * @author 尘世间迷茫的小书童 * */ @Documented //该注解表示 是否被JavaDoc处理并保留在文档中 @Target({ElementType.METHOD, ElementType.TYPE}) //注解使用的地方 @Retention(RetentionPolicy.RUNTIME) //源码保留级别 public @interface NoLogin { }
CheckLoginInterceptor:
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class CheckLoginInterceptor implements HandlerInterceptor { private static final Logger logger = Logger.getLogger(CheckLoginInterceptor.class); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // TODO Auto-generated method stub if(!(handler instanceof HandlerMethod)) { logger.warn("当前操作handler不为HandlerMethod=" + handler.getClass().getName() + ",req=" + request.getQueryString()); return true; } HandlerMethod handlerMethod = (HandlerMethod) handler; String methodName = handlerMethod.getMethod().getName(); NoLogin noLogin = handlerMethod.getMethod().getAnnotation(NoLogin.class); if(null != noLogin) { logger.info("当前访问methodName=" + methodName + "不需要登陆"); System.out.println("当前访问methodName=" + methodName + "不需要登陆"); return true; } noLogin = handlerMethod.getMethod().getDeclaringClass().getAnnotation(NoLogin.class); if(null != noLogin) { logger.info("当前访问methodName= " + methodName + " 不需要登陆"); System.out.println("当前访问methodName= " + methodName + " 不需要登陆"); return true; } //验证请求中是否包含session if(null == request.getSession()) { logger.info("当前访问 methodName=" + methodName + "用户未登录,IP= " + request.getRemoteAddr()); System.out.println("当前访问 methodName=" + methodName + "用户未登录,IP= " + request.getRemoteAddr()); return false; } logger.info("当前访问methodName=" + methodName + "需要登陆"); System.out.println("当前访问methodName=" + methodName + "需要登陆"); return false; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // TODO Auto-generated method stub } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // TODO Auto-generated method stub } }
InterceptorConfig:
import java.util.List; import org.springframework.context.annotation.Configuration; import org.springframework.format.FormatterRegistry; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.validation.MessageCodesResolver; import org.springframework.validation.Validator; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.HandlerMethodReturnValueHandler; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer; import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.ViewResolverRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
//也可以继承WebMvcConfigurerAdapter类只重写addInterceptors方法,下面代码比较啰嗦 @Configuration public class InterceptorConfig implements WebMvcConfigurer { @Override public void configurePathMatch(PathMatchConfigurer configurer) { // TODO Auto-generated method stub } @Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { // TODO Auto-generated method stub } @Override public void configureAsyncSupport(AsyncSupportConfigurer configurer) { // TODO Auto-generated method stub } @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { // TODO Auto-generated method stub } @Override public void addFormatters(FormatterRegistry registry) { // TODO Auto-generated method stub } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new CheckLoginInterceptor()).addPathPatterns("/**"); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // TODO Auto-generated method stub } @Override public void addCorsMappings(CorsRegistry registry) { // TODO Auto-generated method stub } @Override public void addViewControllers(ViewControllerRegistry registry) { // TODO Auto-generated method stub } @Override public void configureViewResolvers(ViewResolverRegistry registry) { // TODO Auto-generated method stub } @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { // TODO Auto-generated method stub } @Override public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) { // TODO Auto-generated method stub } @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { // TODO Auto-generated method stub } @Override public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { // TODO Auto-generated method stub } @Override public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) { // TODO Auto-generated method stub } @Override public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) { // TODO Auto-generated method stub } @Override public Validator getValidator() { // TODO Auto-generated method stub return null; } @Override public MessageCodesResolver getMessageCodesResolver() { // TODO Auto-generated method stub return null; } }
TestController:
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class TestController { @NoLogin @GetMapping("/user/login.htm") @ResponseBody public void login(String username, String password) { } @ResponseBody @GetMapping("/user/userInfo.htm") public void getUserInfo(Long userId) { } @NoLogin @ResponseBody @GetMapping("/user/register.htm") public void register(String username, String password) { } }
运行效果:
2019-06-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=login不需要登陆 当前访问methodName=login不需要登陆 2019-06-29 00:27:37.214 INFO 11388 --- [nio-8001-exec-9] www.mxh.com.CheckLoginInterceptor : 当前访问methodName=register不需要登陆 当前访问methodName=register不需要登陆