gpt4 book ai didi

java Servlet Filter 基于位置的设置

转载 作者:行者123 更新时间:2023-11-30 03:31:14 24 4
gpt4 key购买 nike

我的应用程序被来自不同国家/地区的访问,我使用通用 servlet 过滤器 (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)

但我不知道怎么办?

我需要这样做,因为我们根据国家/地区执行不同的行为,例如他们的移动不验证、管理用户订阅服务等。

请给我建议。

谢谢

最佳答案

我认为不可能使用您的 web.xml为了这。但是,您可以通过编码 MyFilter 来完成您想要的任务。仔细类,这样在添加新国家时就不需要修改它。

我发现您正在使用 Spring。这是个好消息,因为 MyFilter实际上是一个由Spring管理的bean。这意味着其他 Bean 可能会注入(inject)其中。我的建议是,每个国家/地区有一个 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>

这将使 bean 命名为 myfilter为每个请求调用。

然后,实现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 Autowiring 行为。如果您 Autowiring Map<String, T> ,那么 Spring 将使用类 T 的 bean 的所有实例填充此映射。 ,键等于 bean 名称,值等于相应的 bean 实例。

然后,您需要 CountryFilter接口(interface):

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 .

关于java Servlet Filter 基于位置的设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28984656/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com