package security.filter; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.web.context.ContextLoader; import org.springframework.web.context.WebApplicationContext; import security.SecurityContext; import security.internal.SecurityAuthoritiesHolder; import security.internal.SecurityResourceProcessor; import security.util.AuthenticationUtil; /** * 登录接口过滤器 * */ public class UrlResourceFilterInvocation implements Filter { /** * url 白名单 */ private List urls = new ArrayList(); private SecurityAuthoritiesHolder securityAuthoritiesHolder; private SecurityResourceProcessor securityResourceProcessor; private String redirectUrl = "../login.jsp"; @Override public void init(FilterConfig arg0) throws ServletException { urls.add("/public/**");// 登录时 WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext(); securityAuthoritiesHolder = (SecurityAuthoritiesHolder) webApplicationContext .getBean("securityAuthoritiesHolder"); securityResourceProcessor = (SecurityResourceProcessor) webApplicationContext .getBean("securityResourceProcessor"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest) request; HttpServletResponse httpServleResponse = (HttpServletResponse) response; String servletPath = httpServletRequest.getServletPath(); if (!".action".equals(servletPath.substring(servletPath.length() - 7))) {// 白名单直接过滤,非action请求直接过滤 filterChain.doFilter(request, response); return; } for (int i = 0; i < urls.size(); i++) { if (AuthenticationUtil.isUrlMatch(urls.get(i), servletPath)) { filterChain.doFilter(request, response); return; } } HttpSession session = httpServletRequest.getSession(); Object contextFromSessionObject = session.getAttribute("SPRING_SECURITY_CONTEXT"); if (contextFromSessionObject == null) { httpServleResponse.sendRedirect(httpServleResponse.encodeRedirectURL(redirectUrl)); return; } if (!(contextFromSessionObject instanceof SecurityContext)) { httpServleResponse.sendRedirect(httpServleResponse.encodeRedirectURL(redirectUrl)); return; } SecurityContext securityContext = (SecurityContext) contextFromSessionObject; if (securityResourceProcessor.isUrlAccessible(servletPath, securityContext.getRoles())) { filterChain.doFilter(request, response); } } @Override public void destroy() { } }