package com.dsh.guns.config; import com.dsh.course.feignClient.auth.UserClient; import com.dsh.course.feignClient.auth.model.RefreshTokenRequest; import com.dsh.course.feignClient.auth.model.TokenResponse; import com.dsh.guns.modular.system.util.JWTTokenUtils; import com.dsh.guns.modular.system.util.TokenException; import com.dsh.guns.modular.system.warpper.ParseToken; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import javax.annotation.Resource; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; /** * 权限拦截器 */ @Order(1) @Component @WebFilter() public class AuthFilter implements Filter { @Resource private UserClient userClient; private String[] resource = new String[]{"html", "js", "css","icon","ico","png","img","jpeg","jpg", "gif"}; private String[] releaseApi = new String[]{"/login", "/logout","/systemNotice/querySystemNoticeList","/systemNotice/queryNoReadNoticeNum" ,"/api/hotAddress/queryHotAddress","/kaptcha","/update","/password.html","/getSMSCode","/updatePassword","/agreeMent"}; @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; HttpSession session = request.getSession(); Object token = session.getAttribute("token"); String uri = request.getRequestURI().split("\\?")[0]; if(uri.lastIndexOf(".") > 0){ String substring = uri.substring(uri.lastIndexOf(".") + 1); for (String s : resource) { if (substring.contains(s)) { filterChain.doFilter(request, response); return; } } } for (String s : releaseApi) { if (uri.contains(s)) { filterChain.doFilter(request, response); return; } } if(null == token){//需要重新登录(跳转登录页) Authentication is required for continued access. Please proceed to the login page to authenticate. response.sendRedirect(request.getContextPath() + "/login"); return; } TokenResponse tokenResponse = (TokenResponse) token; try { ParseToken parseToken = JWTTokenUtils.parseToken(tokenResponse.getToken()); } catch (TokenException e) { if(e.getCode() == 10003){ RefreshTokenRequest refreshTokenRequest = new RefreshTokenRequest(); refreshTokenRequest.setToken(tokenResponse.getToken()); refreshTokenRequest.setRefresh_token(tokenResponse.getRefresh_token()); TokenResponse tokenResponse1 = userClient.refreshToken(refreshTokenRequest); if(null == tokenResponse1){//需要重新登录(跳转登录页) Authentication is required for continued access. Please proceed to the login page to authenticate. response.sendRedirect(request.getContextPath() + "/logout"); return; }else{ session.setAttribute("token", tokenResponse1); } }else{ response.sendRedirect(request.getContextPath() + "/logout"); return; } } filterChain.doFilter(request, response); } @Override public void destroy() { } }