我的应用程序是从不同的国家/地区访问的,我使用一个公共的servlet Filter(MyFilter.java)来控制所有请求。是否可以根据国家/地区的访问者重定向到其他Servlet? 目前我的web.xml配置在
下面 <filter>
<filter-name>myfilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>myfilter</filter-name>
<url-pattern>*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
假设用户访问美国我想将其重定向到US_Filter.java,或者如果用户访问澳大利亚我想将其重定向到AU_Filter.java,或者如果用户从英国访问我想将其重定向到UK_Filter.java 。这可能来自web.xml吗?
我正在考虑在web.xml中进行国家明智的配置,如
country=US (US_Filter)
country=AU (AU_Filter)
country=UK (UK_Filter)
country=None (MyFilter)
但我不知道怎么办?
我之所以要求这是因为我们根据各个国家/地区执行了不同的行为,例如他们的移动无需验证,管理用户订阅服务等。
请给我建议。
谢谢,
答案 0 :(得分:2)
我认为无法使用您的web.xml
。但是,您可以通过仔细编写MyFilter
课程代码来完成您想要的工作,这样您就无需在添加新国家时对其进行修改。
我看到你正在使用Spring。这是个好消息,因为MyFilter
实际上是由Spring管理的bean。这意味着可能会向其注入其他bean。我的建议是你每个国家有一个bean和一个主过滤器,负责委托给正确的国家bean。
首先,让你的web.xml
现在就是:
<filter>
<filter-name>myfilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>myfilter</filter-name>
<url-pattern>*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
这将允许为每个请求调用名为myfilter
的bean。
然后,以与国家/地区无关的方式实施MyFilter
,以便在添加或删除国家/地区时不需要对其进行修改:
@Component("myfilter")
public class MyFilter implements Filter {
public static final String DEFAULT = "default";
public static final String SUFFIX = "_Filter";
// Autowire all beans that implement CountryFilter, mapped by bean name
@Autowired
private Map<String, CountryFilter> filters;
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// Get country code from request
Locale locale = request.getLocale();
String countryCode = locale.getCountry().toUpperCase();
// Format key to gey country-specific filter
String key = countryCode + SUFFIX;
// If bean doesn't exist for request country...
if (!this.filters.containsKey(key)) {
// ..fallback to default filter
key = DEFAULT + SUFFIX;
}
// Get filter for country
CountryFilter filter = this.filters.get(key);
// Delegate to actual country (or default) filter
boolean countinueChain = filter.doFilterForCountry(request, response);
if (continueChain) {
chain.doFilter(request, response);
}
}
@Override
public void init(FilterConfig config) throws ServletException {
}
@Override
public void destroy() {
}
}
这个类很通用。添加或删除国家/地区时,您无需更改它。诀窍是对集合使用Spring自动装配行为。如果您自动装配Map<String, T>
,那么Spring将使用类T
的bean的所有实例填充此映射,其键是与bean名称相同的值,并为相应的bean实例赋值。
然后,您需要CountryFilter
界面:
public interface CountryFilter {
boolean doFilterForCountry(ServletRequest request, ServletResponse response)
throws IOException, ServletException;
}
您需要为每个国家/地区实施CountryFilter
,让它成为名称与模式CC_Filter
匹配的Spring bean,其中CC
代表2位数ISO国家代码。例如,对于美国,您可能有:
@Component("US" + MyFilter.SUFFIX)
public class UsFilter implements CountryFilter {
@Override
public boolean doFilterForCountry(ServletRequest request, ServletResponse response)
throws IOException, ServletException {
// TODO Handle US specifics here
// VERY IMPORTANT: you might want to let the chain continue...
return true;
// ...or redirect to US page
// ((HttpServletResponse) response).sendRedirect("US-url");
// return false;
// ONLY ONE of the options!
}
}
对于英国:
@Component("UK" + MyFilter.SUFFIX)
public class UkFilter implements CountryFilter {
@Override
public boolean doFilterForCountry(ServletRequest request, ServletResponse response)
throws IOException, ServletException {
// TODO Handle UK specifics here
// VERY IMPORTANT: you might want to let the chain continue...
return true;
// ...or redirect to UK page
// ((HttpServletResponse) response).sendRedirect("UK-url");
// return false;
// ONLY ONE of the options!
}
}
其他国家也一样。
最后,可能会发生您没有针对特定国家/地区的实施。在这种情况下,您可能希望将默认过滤器作为后备案例:
@Component(MyFilter.DEFAULT + MyFilter.SUFFIX)
public class DefaultFilter implements CountryFilter {
@Override
public boolean doFilterForCountry(ServletRequest request, ServletResponse response)
throws IOException, ServletException {
// TODO Handle DEFAULT specifics here
// VERY IMPORTANT: you might want to let the chain continue...
return true;
// ...or redirect to DEFAULT page
// ((HttpServletResponse) response).sendRedirect("DEFAULT-url");
// return false;
// ONLY ONE of the options!
}
}
希望这可以帮助您解决问题。我认为这是一种非常灵活的方法,它甚至还有一个后备案例。要添加新国家/地区,您需要做的就是实施新的CountryFilter
。
答案 1 :(得分:0)
http://examples.javacodegeeks.com/core-java/util/locale/java-util-locale-example/
请浏览本网站!!
使用该网站我建议您添加另一个过滤器,以便检查区域设置&amp;重定向到所需的servlet。