Recently, a project has been built using SpringBoot 2.X. Most of the interfaces need login checking, so we intend to use annotation + interceptor to implement it, and record the implementation process here.
First, the principle of implementation
1. Customize a comment @NeedLogin and add it to the interface method or class method if the interface needs login checking.
2. Logon interceptor LoginInterceptor checks whether there are @NeedLogin annotations in the method or class of the interface, and logon checks if there are annotations.
II. Major Codes
1. NeedLogin annotation code
package com.example.helloSpringBoot.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * Login annotation * * @Author: Java Fragment */ @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface NeedLogin { }
2. Login Interceptor
package com.example.helloSpringBoot.config; import com.example.helloSpringBoot.annotation.NeedLogin; import com.example.helloSpringBoot.util.WxUserInfoContext; import org.springframework.lang.Nullable; import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Logon interceptor * * @Author: Java Fragment */ @Component public class LoginInterceptor implements HandlerInterceptor { //This method is executed before accessing the interface. We only need to write the business logic to verify the login status here to verify the login status before the user calls the specified interface. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (handler instanceof HandlerMethod) { NeedLogin needLogin = ((HandlerMethod) handler).getMethodAnnotation(NeedLogin.class); if (null == needLogin) { needLogin = ((HandlerMethod) handler).getMethod().getDeclaringClass() .getAnnotation(NeedLogin.class); } // Check login if you have login validation annotations if (null != needLogin) { WxUserInfoContext curUserContext = (WxUserInfoContext) request.getSession() .getAttribute("curUserContext"); //If session No, not logged in. if (null == curUserContext) { response.setCharacterEncoding("UTF-8"); response.getWriter().write("Not logged in!"); return false; } } } return true; } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { } public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { } }
3. Configuration of interceptors
package com.example.helloSpringBoot.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** * WebConfig * * @Author: Java Fragment * */ @Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private LoginInterceptor loginInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { // Custom interceptor, add intercept path and exclude intercept path registry.addInterceptor(loginInterceptor).addPathPatterns("/**"); } }
3. Verification Code
HelloController adds two methods, testNeedLogin() adds login interception, and testNoLogin() does not require login interception.
package com.example.helloSpringBoot.controller; import com.example.helloSpringBoot.annotation.NeedLogin; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { /** * Testing does not require login * * */ @RequestMapping("/testNoLogin") public String testNoLogin (){ return "The call is successful, this interface does not need login validation!-Java Broken read!"; } /** * Testing requires login * * */ @NeedLogin @RequestMapping("/testNeedLogin") public String testNeedLogin (){ return "testNeedLogin!"; } }
TesNeedLogin runs as follows:
TesNoLogin runs as follows:
The login interception can be achieved after the above three steps are completed. If you have any questions, please leave a message to communicate.
Full source address: https://github.com/suisui2019/helloSpringBoot
Recommended reading
1. How does Spring Boot 2.X gracefully solve cross-domain problems?
2.Redis Cluster Builds High Availability Redis Server Cluster
3. Why is single-threaded EDIS so fast?
4.Spring Boot integrates spring session to realize session sharing
5.Spring Boot Introduction - Quick Building web Projects
6. Spring Boot 2.0 Integrates Redis
7. An article on Spring MVC parameter binding
8. How can Spring MVC + Mybatis configure multiple data sources and switch?
Time-limited access to free Java-related information, covering Java, Redis, MongoDB, MySQL, Zookeeper, Spring Cloud, Dubbo/Kafka, Hadoop, Hbase, Flink and other high-concurrent distributed, large data, machine learning technology.
Data portal: https://mp.weixin.qq.com/s/u2b_NVNuMuAPE0w4lc45fw
Pay attention to the following public numbers for free: