【发布时间】:2015-05-01 04:52:44
【问题描述】:
我想实现一个 Http 过滤器来拦截对我的网站发出的一些请求。我想拦截对http://www.mywebsite.com/referral/userid 的请求。我编写了以下过滤器类:
public class ReferralFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String contextPath = ((HttpServletRequest) request).getContextPath();
String requestURI = httpRequest.getRequestURI();
requestURI = StringUtils.substringAfter(requestURI, contextPath);
if(StringUtils.contains(requestURI, "/referral/")){
String referralIdentifier = StringUtils.substringAfter(requestURI, contextPath+"/referral/");
//Search the referral's user
if(referralIdentifier!=null && referralIdentifier.length()==12){
String cookieKey = "website.referral";
String cookieValue = referralIdentifier;
Cookie cookie = new Cookie(cookieKey,cookieValue);
cookie.setMaxAge(60*60*24*365);
((HttpServletResponse) response).addCookie(cookie);
//redirect to the home page angularJS app
requestURI = StringUtils.substringBeforeLast(requestURI,"/referral/")+"#";
}
}
String newURI = requestURI;
request.getRequestDispatcher(newURI).forward(request, response);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
这是我的配置:
@Configuration
@AutoConfigureAfter(CacheConfiguration.class)
public class WebConfigurer implements ServletContextInitializer, EmbeddedServletContainerCustomizer {
private final Logger log = LoggerFactory.getLogger(WebConfigurer.class);
@Inject
private Environment env;
@Autowired(required = false)
private MetricRegistry metricRegistry;
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
log.info("Web application configuration, using profiles: {}", Arrays.toString(env.getActiveProfiles()));
EnumSet<DispatcherType> disps = EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.ASYNC);
// some initializations
initReferralFilter(servletContext,disps);
log.info("Web application fully configured");
}
/**
* Initializes the Referral filter.
*/
private void initReferralFilter(ServletContext servletContext, EnumSet<DispatcherType> disps) {
log.debug("Registering Referral Filter");
FilterRegistration.Dynamic referralFilter = servletContext.addFilter("referralFilter", new ReferralFilter());
referralFilter.addMappingForUrlPatterns(disps, true, "/referral/*");
}
// other methods
}
当我尝试访问http://www.mywebsite.com/referral/eRfdg54GDGd2 时,我的过滤器会无限执行。为什么?
谢谢
【问题讨论】:
标签: java filter servlet-filters