@LoginPermission注解的使用
通过拦截器进行判断,通过方法签名获取当前访问的方法上面是否使用@LoginPermission注解
Spring MVC中的拦截器/过滤器HandlerInterceptorAdapter的使用
Spring MVC的拦截器,不仅可实现Filter的所有功能,还可以更精确的控制拦截精度。
Spring MVC提供的org.springframework.web.servlet.handler.HandlerInterceptorAdapter这个适配器,继承此类可以非常方便的实现自己的拦截器。
1)preHandle在业务处理器处理请求之前被调用。预处理,可以进行编码、安全控制等处理(判断用户是否有登陆权限,项目中有使用);
2)postHandle在业务处理器处理请求执行完成后,生成视图之前执行。
HandlerMethod(方法处理器)封装了很多属性,在访问请求方法的时候可以方便的访问到方法、方法参数、方法上的注解、所属类等并且对方法参数封装处理,也可以方便的访问到方法参数的注解等信息。
/**
* 1)打印请求头信息
* 2)进行登陆权限判断
*/
@Component
public class GlobalInterceptor extends HandlerInterceptorAdapter {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private RedisUtils redisUtils;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
if (handlerMethod.getBean() != null && handlerMethod.getBean() instanceof BaseController) {
//BaseController baseController = (BaseController) handlerMethod.getBean();
logger.info("request header and params----->" + getRequestInfo(request));
Method method = handlerMethod.getMethod();
LoginPermission loginPermission = method.getAnnotation(LoginPermission.class);
if (loginPermission != null) {
PicaUser user = this.getPicaUser(request);
logger.info("picaUser----->" + user.toString());
//logger.info("picaUser----->" +JSONObject.toJSONString(user);
if (null == user || user.getId() == null || user.getId() == 0) {
response.setContentType("application/json; charset=utf-8");
PrintWriter writer = response.getWriter();
writer.print(JSONObject.toJSONString(BaseResult.buildSuccess(null), new SerializerFeature[]{SerializerFeature.WriteMapNullValue, SerializerFeature.WriteDateUseDateFormat}));
writer.close();
response.flushBuffer();
return false;
}
}
}
}
return true;
}
/**
* 如果用户登陆成功,获取用户信息
*
* @param request
* @return
*/
private PicaUser getPicaUser(HttpServletRequest request) throws Exception {
String user = request.getHeader("picaUser");
String token = request.getHeader("token");
PicaUser picaUser = null;
//一般是空的
if (!StringUtils.isEmpty(user)) {
user = URLDecoder.decode(user, "utf-8");
picaUser = (PicaUser) JSONObject.parseObject(user, PicaUser.class);
}
if (!StringUtils.isEmpty(token)) {
picaUser = (PicaUser) this.redisUtils.getToken(token, PicaUser.class);
}
return picaUser;
}
/**
* 获取请求信息
*
* @param request
* @return
*/
private Map<String, Object> getRequestInfo(HttpServletRequest request) {
HashMap<String, Object> map = new HashMap<>();
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String key = headerNames.nextElement();
Object value = request.getHeader(key);
map.put(key, value);
}
return map;
}
}