java Servlet Filter基于位置的设置

时间:2015-03-11 10:52:09

标签: java jsp servlets servlet-filters

我的应用程序是从不同的国家/地区访问的,我使用一个公共的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)

但我不知道怎么办?

我之所以要求这是因为我们根据各个国家/地区执行了不同的行为,例如他们的移动无需验证,管理用户订阅服务等。

请给我建议。

谢谢,

2 个答案:

答案 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。