没次都要从session 取id ,怎么把这个重复存在提出来变成aop
这么看来是可以的,针对此类的 Controller 调用方法之前执行这些类似的代码片段。
我能想到的思路是,首先使用自定义注解,在自定义注解里面保存service的名称和调用方法的名称,然后在注解切面实现类里面传进去service的名称和方法名称,然后使用反射原理执行相应的方法
@Target(ElementType.METHOD) //表示该注解使用在方法上
@Retention(RetentionPolicy.RUNTIME) //注解在什么时候进行
@Documented //生成文档
public @interface SysLog {
String serviceName() default "";
String methodName() default "";
}
我觉得使用filter或interceptor可以实现, 你这个看起来就是这个controller下的所有的请求都是如果userId为null,那么就直接返回了,不进行后续的处理,在interceptor中判断如果是请求这个controller的,那么进行判断,如果为null,则直接统一返回。
这篇文章可以参考一下:https://www.jianshu.com/p/fe7428e2e5b0
只需要在preHandle()
方法中进行处理即可
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 可以从request中获取到session
Integer userId = userService.selUserId(session);
if(userId == null) {
// 如果需要返回json数据到页面,通过response可以处理
response.writer("错误信息")
return false;
}
return true;
}
可以的
使用spring的aop注解
定义pointcut包路径
spring会自动生成代理类
大概的逻辑,获取session的地方,我只是提供一种思路,具体看你调试怎么能取到。
定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SelUser {
}
aop逻辑:
@Aspect
@Component
public class SelUserAop {
@Autowired
private UserService userService;
@Pointcut("@annotation(com.gourd.common.annotation.SelUser)")
public void serviceSelUser() {
}
@Around("serviceSelUser()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
request.getParameter("session");
Integer userId = userService.selUserId(session);
if(userId !=null){
return pjp.proceed();
}else {
return ResponseFactory.createFailResponse(ResponseStatus.USER_LOGIN_OVERDUE);
}
}
}
没必要就那几行代码,以后要改的话,还要从aop里面拿出来