青橘子的服务端 - 拦截器+注解实现登陆验证
2017-11-27 本文已影响33人
茶九言
思路
拦截器拦截所有配置好的路径,取出注解对象判断是否需要进行登陆判断。
其实也可以用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;
}
}