@Slf4j
@WebFilter(urlPatterns = {"/*"}, filterName = "authFilter")
@Component
@PropertySource(value = "classpath:application.properties", encoding = "UTF-8")
public class AuthFilter implements Filter {
@Value("${sso.auth.login.service}")
private String ssoAuthLoginService;
@Value("${sso.auth.login.callback.service}")
private String ssoAuthLoginCallbackService;
@Value("${sso.auth.login.jsessionid}")
private String JSESSIONID;
@Value("${sso.auth.login.cookie.expire:604800}")
private int cookieExpire;
@Value("${sso.auth.login.session.expire:604800}")
private long sessionExpire;
private AuthRedisDao authRedisDao;
public AuthFilter(AuthRedisDao authRedisDao){
this.authRedisDao = authRedisDao;
}
@Override
public void init(FilterConfig filterConfig) {
log.info("init");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("doFilter:url={}",((HttpServletRequest) servletRequest).getRequestURL());
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
String sessionId = CookieUtil.getCookie(request, JSESSIONID);
if (sessionId!=null){
String session = authRedisDao.getSession(sessionId);
log.info("session={}", session);
if (session!=null){//登录有效
//刷新session过期时间
authRedisDao.setSession(sessionId, session, sessionExpire);
//重置cookie过期时间
Cookie cookie = CookieUtil.getCookie(JSESSIONID, sessionId, cookieExpire);
response.addCookie(cookie);
//包装request设置登陆信息
filterChain.doFilter(new AuthHttpServletRequestWrapper(request, session),response);
return;
}
}
StringBuffer requestUrl = request.getRequestURL();
if (StringUtils.equals(ssoAuthLoginCallbackService, requestUrl)){
boolean hasTargetUrl = request.getParameterMap().containsKey("targetUrl");
boolean hasTicket = request.getParameterMap().containsKey("ticket");
log.info("hasTargetUrl={}",hasTargetUrl);
log.info("hasTicket={}",hasTicket);
if (hasTargetUrl && hasTicket){
filterChain.doFilter(request, response);
return;
}
}
String redirectUrl = ssoAuthLoginService + requestUrl;
log.info("redirectUrl={}", redirectUrl+"\r\n");
response.sendRedirect(redirectUrl);
}
@Override
public void destroy() {
log.info("destroy");
}
}