org.frameworkset.web.util.UrlPathHelper Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of bboss-util Show documentation
Show all versions of bboss-util Show documentation
bboss is a j2ee framework include aop/ioc,mvc,persistent,taglib,rpc,event ,bean-xml serializable and so on.http://www.bbossgroups.com
package org.frameworkset.web.util;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.frameworkset.util.StringUtil;
public class UrlPathHelper
{
public static final String INCLUDE_URI_REQUEST_ATTRIBUTE = "bboss.servlet.include.request_uri";
/** @deprecated */
public static final String INCLUDE_CONTEXT_PATH_REQUEST_ATTRIBUTE = "javax.servlet.include.context_path";
/** @deprecated */
public static final String INCLUDE_SERVLET_PATH_REQUEST_ATTRIBUTE = "javax.servlet.include.servlet_path";
private final Logger logger = LoggerFactory.getLogger(getClass());
private boolean alwaysUseFullPath = true;
private boolean urlDecode = false;
private String defaultEncoding = "ISO-8859-1";
public void setAlwaysUseFullPath(boolean alwaysUseFullPath)
{
this.alwaysUseFullPath = alwaysUseFullPath;
}
public void setUrlDecode(boolean urlDecode)
{
this.urlDecode = urlDecode;
}
public void setDefaultEncoding(String defaultEncoding)
{
this.defaultEncoding = defaultEncoding;
}
protected String getDefaultEncoding()
{
return this.defaultEncoding;
}
public String getLookupPathForRequest(HttpServletRequest request)
{
if (this.alwaysUseFullPath) {
return getPathWithinApplication(request);
}
String rest = getPathWithinServletMapping(request);
if (!"".equals(rest)) {
return rest;
}
return getPathWithinApplication(request);
}
public String getPathWithinServletMapping(HttpServletRequest request)
{
String pathWithinApp = getPathWithinApplication(request);
String servletPath = getServletPath(request);
if (pathWithinApp.startsWith(servletPath))
{
return pathWithinApp.substring(servletPath.length());
}
return servletPath;
}
private static final String requestPathWithinApplicationcachkey = "request.pathWithinApplication.cachkey";
public String getPathWithinApplication(HttpServletRequest request)
{
//解决上下文为/时,mvc映射请求无效问题注释开始
// String contextPath = getContextPath(request);
// String requestUri = getRequestUri(request);
//
// if (StringUtil.startsWithIgnoreCase(requestUri, contextPath))
// {
// String path = requestUri.substring(contextPath.length());
// return !StringUtil.isEmpty((String)path) ? path : "/";
// }
//
// return requestUri;
//解决上下文为/时,mvc映射请求无效问题注释完毕 20150122
String ret = (String)request.getAttribute(requestPathWithinApplicationcachkey);
String servletpath = request.getServletPath();
/**
* ret在以下情况与servletpath不相等
* 场景1 index.jsp forword to /index.htm时,在处理/index.htm时 servletpath为/index.htm而ret为index.jsp,所以需要重新计算地址
* 场景2 mvc dispatcher拦截了地址模式类似于 /rest/*的请求时,servletpath为/rest,而ret为具体的地址/rest/people/1 这样每次都不会相等,每次都需要重新计算地址
*
*/
if(ret != null && ret.equals(servletpath))
return ret;
String contextPath = getContextPath(request);
String requestUri = getRequestUri(request);
if (StringUtil.startsWithIgnoreCase(requestUri, contextPath))
{
String path = requestUri.substring(contextPath.length());
requestUri = path ;
}
else
{
}
if(requestUri.equals("/"))
{
// String servletpath = request.getServletPath();
if(servletpath != null && !servletpath.equals(""))
requestUri = servletpath;
}
request.setAttribute(requestPathWithinApplicationcachkey, requestUri);
return requestUri;
}
public String getRequestUri(HttpServletRequest request)
{
String uri = (String)request.getAttribute(INCLUDE_URI_REQUEST_ATTRIBUTE);
if (uri != null) {
return uri;
}
//
// String path = request.getServletPath();
// return decodeAndCleanUriString(request, uri);
uri = request.getRequestURI();
uri = decodeAndCleanUriString( request, uri);
return uri;
}
public String getContextPath(HttpServletRequest request)
{
// String contextPath = (String)request.getAttribute("javax.servlet.include.context_path");
// if (contextPath == null) {
// contextPath = request.getContextPath();
// }
// if ("/".equals(contextPath))
// {
// contextPath = "";
// }
// return decodeRequestString(request, contextPath);
String contextPath = request.getContextPath();
if ("/".equals(contextPath))
{
contextPath = "";
}
return contextPath;
}
public String getServletPath(HttpServletRequest request)
{
// String servletPath = (String)request.getAttribute("javax.servlet.include.servlet_path");
// if (servletPath == null) {
// servletPath = request.getServletPath();
// }
// return servletPath;
return request.getServletPath();
}
public String getOriginatingRequestUri(HttpServletRequest request)
{
// String uri = (String)request.getAttribute("javax.servlet.forward.request_uri");
// if (uri == null) {
// uri = request.getRequestURI();
// }
// return decodeAndCleanUriString(request, uri);
String uri = (String)request.getAttribute(INCLUDE_URI_REQUEST_ATTRIBUTE);
if (uri != null) {
return uri;
}
uri = request.getRequestURI();
uri = decodeAndCleanUriString( request, uri);
return uri;
}
public String getOriginatingContextPath(HttpServletRequest request)
{
// String contextPath = (String)request.getAttribute("javax.servlet.forward.context_path");
// if (contextPath == null) {
// contextPath = request.getContextPath();
// }
// return decodeRequestString(request, contextPath);
return request.getContextPath();
}
public String getOriginatingQueryString(HttpServletRequest request)
{
String queryString = (String)request.getAttribute("javax.servlet.forward.query_string");
if (queryString == null) {
queryString = request.getQueryString();
}
return queryString;
}
private String decodeAndCleanUriString(HttpServletRequest request, String uri)
{
uri = decodeRequestString(request, uri);
int semicolonIndex = uri.indexOf(';');
return semicolonIndex != -1 ? uri.substring(0, semicolonIndex) : uri;
}
public String decodeRequestString(HttpServletRequest request, String source)
{
if (this.urlDecode) {
String enc = determineEncoding(request);
try {
return URLDecoder.decode(source, enc);
}
catch (UnsupportedEncodingException ex)
{
this.logger.warn("Could not decode request string [" + source + "] with encoding '" + enc + "': falling back to platform default encoding; exception message: " + ex.getMessage());
return URLDecoder.decode(source);
}
}
return source;
}
protected String determineEncoding(HttpServletRequest request)
{
String enc = request.getCharacterEncoding();
if (enc == null) {
enc = getDefaultEncoding();
}
return enc;
}
}