package com.hcmony.web.interceptor;
import com.hcmony.service.auth.ValidationService;
import com.hcmony.service.auth.impl.ValidationServiceImpl;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* <h3>权限拦截</h3>
* <p></p>
*
* @author hcmony
* @since V1.0.0, 2017/12/15 18:13
*/
@Configuration
public class AuthInterceptor extends HandlerInterceptorAdapter {
private final Logger logger = Logger.getLogger(AuthInterceptor.class);
@Autowired
private ValidationService validationService; //这个service可以用db或者缓存取数据查询
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
//todo 后面具体实现 此处后面可以做日志操作记录
String token = request.getHeader("token");
if(token==null){
request.getRequestDispatcher("/notLogin").forward(request,response);
return false;
}
//假如无法注入的情况下
if(validationService==null){
BeanFactory factory = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext());
validationService = (ValidationServiceImpl) factory.getBean("validationServiceImpl");
}
String user = (String) validationService.verifyAccessToken(token);
if(user==null){
request.getRequestDispatcher("/noAuth").forward(request,response);
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// log.info("在Controller请求处理之后进行调用,但是在视图被渲染之前");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) throws Exception {
// log.info("在整个请求结束之后被调用,也就是在DispatcherServlet渲染了对应的视图之后执行(主要是用于进行资源清理工作)");
}
}