原創文章,鼓勵轉載請務必注明出處,作者:李佳
最近項目中需要轉換路徑,把通路/m ,/m/,/m/* 的連接配接分發到三種不同類型的手機中,解決方法是使用Filter,在進入Servlet之前進行攔截,之後改變顯示路徑相關代碼如下:
package common.util.mobile;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import common.init.InitParam;
public class MoblieFilter implements Filter{
protected FilterConfig filterConfig;
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
try{
HttpServletRequest httpRequest = (HttpServletRequest)request;
HttpServletResponse httpResponse = (HttpServletResponse)response;
String requestURL = httpRequest.getRequestURI();
InitParam.DebugLog("[doFilter:] Coming URL:" + requestURL);
String replacement = "/i/";
if(requestURL.equals("/m/") ||requestURL.equals("/m")){
httpRequest.getRequestDispatcher(httpResponse.encodeURL("/m/index.servlet?moblie=true")).forward(request, response);
//httpResponse.sendRedirect(httpResponse.encodeRedirectURL("/m/index.servlet?moblie=true"));
} else
{
int mobiletype = Carrier.recognize(httpRequest);
if(mobiletype == Carrier.IMODE){
replacement = "/i/";
}else if(mobiletype == Carrier.JSKY){
replacement = "/j/";
}else if(mobiletype == Carrier.EZWEB){
replacement = "/e/";
}
InitParam.DebugLog("[doFilter:] Final URL:" + requestURL.replaceFirst("/m/",replacement));
httpRequest.getRequestDispatcher(requestURL.replaceFirst("/m/",replacement)+"?moblie=true").forward(request, response);
//httpResponse.sendRedirect(httpResponse.encodeRedirectURL(requestURL.replaceFirst("/m/",replacement)+"?moblie=true"));
}
chain.doFilter(request, response);
}catch (Exception e) {
}
}
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
}
在web.xml中加入如下配置:
<filter>
<filter-name>mobilefilter</filter-name>
<filter-class>common.util.mobile.MoblieFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>mobilefilter</filter-name>
<url-pattern>/m/</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>mobilefilter</filter-name>
<url-pattern>/m</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>mobilefilter</filter-name>
<url-pattern>/m/*</url-pattern>
</filter-mapping>