×

青橘子的服务端 - 拦截器+注解实现登陆验证

96
Godya
2017.11.27 10:54 字数 129

思路

拦截器拦截所有配置好的路径,取出注解对象判断是否需要进行登陆判断。
其实也可以用AOP来实现。

代码

测试Controller

@Controller
public class MainController {

    @Resource
    private UserRepositoty userRepositoty;

    @Logined
    @ResponseBody
    @RequestMapping("/")
    public String index() {
        return userRepositoty.findByUserName("test").getName();
    }
}

注解类

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Logined {
}

配置类

@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**");
    }
}

拦截器

@Controller
public class LoginInterceptor  implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandler");
        HandlerMethod handlerMethod = (HandlerMethod) handler;

        // 从方法处理器中获取出要调用的方法
        Method method = handlerMethod.getMethod();

        // 获取出方法上的Logined注解
        Logined needLogin = method.getAnnotation(Logined.class);
        if (needLogin != null && !hasLogined(request.getSession())) {
            returnJson(response, RespJson.error("你需要登陆,少年!"));
            return false;
        }
        return true;
    }
}

参考资料

  1. SpringBoot使用自定义注解实现权限拦截
  2. SpringBoot学习笔记(六):配置拦截器,控制登录跳转
  3. Spring拦截器实现controller层json数据返回
  4. SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
青橘子的开发记录
Web note ad 1