我正在尝试建立一个允许用户创建自己的网页的网站 - 作为网站的子网域,所以我现在要做的是拥有一个查看子网域的过滤器,以及如果它没有被使用,或者它被保留,那么用户将被转发到他们选择子域名的页面。
我遇到的问题是,当我在ServletRequest对象上设置一个属性,然后使用RequestDispatcher转发时,会再次调用过滤器 - 但它看不到我设置的属性。
我已经调试并观看了它的工作(或不工作!),并且正在设置属性,但在转发之后,该属性不存在。
有人可以帮助解释发生了什么,以及我如何解决这个问题?
我可能还应该提到我正在为Java Google App Engine开发。
这是我的过滤器代码。
import java.io.IOException;
import java.util.Enumeration;
import java.util.logging.Logger;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
public class SubdomainFilter implements Filter{
private static Logger log = Logger.getLogger(SubdomainFilter.class.getName());
private static final String[] RESERVED_SUBDOMAINS = {"admin", "home", "www"};
private static final String registerPage = "/register_a_page";
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
//if we've been forwarded, it must have been because of an invalid subdomain
if(arg0.getAttribute("subdomain") != null) {
arg2.doFilter(arg0, arg1);
} else { //otherwise, look at the subdomain and determine what to do
boolean invalidSubdomain = false;
try {
String requestURLInfo = ((HttpServletRequest)arg0).getRequestURL().toString();
String subdomain = URLUtils.getLowestSubdomainFromURL(requestURLInfo);
arg0.setAttribute("subdomain", subdomain);
if(subdomainReserved(subdomain) || subdomainInUse(subdomain)) {
invalidSubdomain = true;
}//Otherwise the subdomain must be valid
} catch(Exception ex) {
log.severe("Filter could not get subdomain:\n" + ex.toString());
} finally {
if(invalidSubdomain) {
RequestDispatcher dispatcher = arg0.getRequestDispatcher(registerPage);
dispatcher.forward(arg0, arg1);
} else {
arg2.doFilter(arg0, arg1);
}
}
}
}
private boolean subdomainReserved(String subdomain) {
boolean subdomainReserved = false;
for(String reservedSubdomain : RESERVED_SUBDOMAINS) {
if(reservedSubdomain.equals(subdomain)) {
subdomainReserved = true;
break;
}
}
return subdomainReserved;
}
private boolean subdomainInUse(String subdomain) {
boolean subdomainInUse = false;
//TODO: implement
return subdomainInUse;
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
答案 0 :(得分:1)
我认为问题在于我没有在web.xml中声明以下内容:
<filter-mapping>
<filter-name>SubdomainFilter</filter-name>
<servlet-name>*</servlet-name>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
答案 1 :(得分:0)
它应该工作。 URLUtils.getLowestSubdomainFromURL()
刚刚返回null
,或者请求 - 响应链中的其他内容已经触发HttpServletResponse#sendRedirect()
。
答案 2 :(得分:0)
我知道这篇文章已有3年历史了,但我仍然想确认路易斯的帖子,转发工作正常,没有以下web.xml 仅限你不需要转发属性(即请求.getAttribute,request.setAttribute)。
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
我不确定在你不需要的时候通过在web.xml中指定调度程序标签是否有任何开销,但是你肯定需要在web.xml中为要工作的属性< /强>