如何在spring boot中使用过滤器转发请求

时间:2018-03-22 09:02:34

标签: java spring-boot filter

在我的Spring Boot项目中,我使用cas身份验证但是对于某些web api,我想跳过它。我创建并注册了如下所示的过滤器。当请求的url类似于/api/**时,它将跳过cas过滤器并直接转发到web api控制器。

当我发布请求时,下面的过滤器将无限循环。但是Spring MVC中的相同过滤器也可以工作。如何防止循环?

@Configuration
public class WebApiConfig {

  @Bean
  public FilterRegistrationBean testFilterRegistration() {
    FilterRegistrationBean registration = new FilterRegistrationBean();
    registration.setFilter(new WebApiFilter());
    registration.setMatchAfter(false);
    registration.addUrlPatterns("/*");
    registration.setName("WebApiFilter");
    registration.setOrder(1);
    return registration;
 }

 public class WebApiFilter implements Filter {

   public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
     HttpServletRequest request = (HttpServletRequest) req;
     HttpServletResponse response = (HttpServletResponse) resp;

     String servletPath = request.getServletPath();
       if (servletPath.startsWith("/api/")) {
         request.getRequestDispatcher(servletPath).forward(request, response);
       } else {
         chain.doFilter(req, resp);
       }
    }

    public void init(FilterConfig config) throws ServletException {}

    public void destroy() {}

  }
}

SpringCasAutoConfig

@ConfigurationProperties(prefix="spring.cas")
public class SpringCasAutoConfig {
static final String separator = ",";

private String validateFilters;
private String signOutFilters;
private String authFilters;
private String assertionFilters;
private String requestWrapperFilters;

private String casServerUrlPrefix;
private String casServerLoginUrl;
private String serverName;
private boolean useSession = true;
private boolean redirectAfterValidation = true;

public List<String> getValidateFilters() {
    return Arrays.asList(validateFilters.split(separator));
}
public void setValidateFilters(String validateFilters) {
    this.validateFilters = validateFilters;
}
public List<String> getSignOutFilters() {
    return Arrays.asList(signOutFilters.split(separator));
}
public void setSignOutFilters(String signOutFilters) {
    this.signOutFilters = signOutFilters;
}
public List<String> getAuthFilters() {
    return Arrays.asList(authFilters.split(separator));
}
public void setAuthFilters(String authFilters) {
    this.authFilters = authFilters;
}
public List<String> getAssertionFilters() {
    return Arrays.asList(assertionFilters.split(separator));
}
public void setAssertionFilters(String assertionFilters) {
    this.assertionFilters = assertionFilters;
}
public List<String> getRequestWrapperFilters() {
    return Arrays.asList(requestWrapperFilters.split(separator));
}
public void setRequestWrapperFilters(String requestWrapperFilters) {
    this.requestWrapperFilters = requestWrapperFilters;
}
public String getCasServerUrlPrefix() {
    return casServerUrlPrefix;
}
public void setCasServerUrlPrefix(String casServerUrlPrefix) {
    this.casServerUrlPrefix = casServerUrlPrefix;
}
public String getCasServerLoginUrl() {
    return casServerLoginUrl;
}
public void setCasServerLoginUrl(String casServerLoginUrl) {
    this.casServerLoginUrl = casServerLoginUrl;
}
public String getServerName() {
    return serverName;
}
public void setServerName(String serverName) {
    this.serverName = serverName;
}
public boolean isRedirectAfterValidation() {
    return redirectAfterValidation;
}
public void setRedirectAfterValidation(boolean redirectAfterValidation) {
    this.redirectAfterValidation = redirectAfterValidation;
}
public boolean isUseSession() {
    return useSession;
}
public void setUseSession(boolean useSession) {
    this.useSession = useSession;
}
}

CasConfig

@Configuration
public class CasConfig {
@Autowired
SpringCasAutoConfig autoconfig;

private static boolean casEnabled  = true;

public CasConfig() {
}

@Bean
public SpringCasAutoConfig getSpringCasAutoconfig(){
    return new SpringCasAutoConfig();
}


@Bean
public ServletListenerRegistrationBean<SingleSignOutHttpSessionListener> singleSignOutHttpSessionListener() {
    ServletListenerRegistrationBean<SingleSignOutHttpSessionListener> listener = new ServletListenerRegistrationBean<>();
    listener.setEnabled(casEnabled);
    listener.setListener(new SingleSignOutHttpSessionListener());
    listener.setOrder(2);
    return listener;
}


@Bean
public FilterRegistrationBean singleSignOutFilter() {
    FilterRegistrationBean filterRegistration = new FilterRegistrationBean();
    filterRegistration.setFilter(new SingleSignOutFilter());
    filterRegistration.setEnabled(casEnabled);
    if(autoconfig.getSignOutFilters().size()>0)
        filterRegistration.setUrlPatterns(autoconfig.getSignOutFilters());
    else
        filterRegistration.addUrlPatterns("/*");
    filterRegistration.addInitParameter("casServerUrlPrefix", autoconfig.getCasServerUrlPrefix());
    filterRegistration.addInitParameter("serverName", autoconfig.getServerName());
    filterRegistration.setOrder(3);
    return filterRegistration;
}


@Bean
public FilterRegistrationBean authenticationFilter() {
    FilterRegistrationBean filterRegistration = new FilterRegistrationBean();
    filterRegistration.setFilter(new AuthenticationFilter());
    filterRegistration.setEnabled(casEnabled);
    if(autoconfig.getAuthFilters().size()>0)
        filterRegistration.setUrlPatterns(autoconfig.getAuthFilters());
    else
        filterRegistration.addUrlPatterns("/*");

    filterRegistration.addInitParameter("casServerLoginUrl", autoconfig.getCasServerLoginUrl());

    filterRegistration.addInitParameter("serverName", autoconfig.getServerName());
    filterRegistration.addInitParameter("useSession", autoconfig.isUseSession()?"true":"false");
    filterRegistration.addInitParameter("redirectAfterValidation", autoconfig.isRedirectAfterValidation()?"true":"false");
    filterRegistration.setOrder(4);
    return filterRegistration;
}


@Bean
public FilterRegistrationBean cas20ProxyReceivingTicketValidationFilter() {
    FilterRegistrationBean filterRegistration = new FilterRegistrationBean();
    Cas20ProxyReceivingTicketValidationFilter cas20ProxyReceivingTicketValidationFilter = new Cas20ProxyReceivingTicketValidationFilter();
    cas20ProxyReceivingTicketValidationFilter.setServerName(autoconfig.getServerName());
    filterRegistration.setFilter(cas20ProxyReceivingTicketValidationFilter);
    filterRegistration.setEnabled(casEnabled);
    if(autoconfig.getValidateFilters().size()>0)
        filterRegistration.setUrlPatterns(autoconfig.getValidateFilters());
    else
        filterRegistration.addUrlPatterns("/*");
    filterRegistration.addInitParameter("casServerUrlPrefix", autoconfig.getCasServerUrlPrefix());
    filterRegistration.addInitParameter("serverName", autoconfig.getServerName());
    filterRegistration.setOrder(5);
    return filterRegistration;
}



@Bean
public FilterRegistrationBean httpServletRequestWrapperFilter() {
    FilterRegistrationBean filterRegistration = new FilterRegistrationBean();
    filterRegistration.setFilter(new HttpServletRequestWrapperFilter());
    filterRegistration.setEnabled(true);
    if(autoconfig.getRequestWrapperFilters().size()>0)
        filterRegistration.setUrlPatterns(autoconfig.getRequestWrapperFilters());
    else
        filterRegistration.addUrlPatterns("/login");
    filterRegistration.setOrder(6);
    return filterRegistration;
}


@Bean
public FilterRegistrationBean assertionThreadLocalFilter() {
    FilterRegistrationBean filterRegistration = new FilterRegistrationBean();
    filterRegistration.setFilter(new AssertionThreadLocalFilter());
    filterRegistration.setEnabled(true);
    if(autoconfig.getAssertionFilters().size()>0)
        filterRegistration.setUrlPatterns(autoconfig.getAssertionFilters());
    else
        filterRegistration.addUrlPatterns("/*");
    filterRegistration.setOrder(7);
    return filterRegistration;
}
}

0 个答案:

没有答案