/**
*
*/
package org.howsun.util;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.howsun.util.security.Codings;
/**
* Web层工具
*
* @author 张纪豪
* @Date 2007-4-26
* @version v1.0
*/
public class Webs {
public static final String URL_PATTERN = "(http://)?([^/]*)(/?.*)";
public enum UrlCodeType{
BASE64,URLENCODE;
}
/**
* 从Request对象中取出字符串
* @param request
* @param name
* @param defaultValue
* @return
*/
public static String getStringByRequestParameter(HttpServletRequest request, String name, String defaultValue){
if(request == null) return defaultValue;
String str = request.getParameter(name);
return str == null ? defaultValue : str.trim();
}
/**
* 从Request对象中取出布尔值
* @param request
* @param name
* @param defaultValue
* @return
*/
public static boolean getBooleanByRequestParameter(HttpServletRequest request, String name, boolean defaultValue){
if(request == null || request.getParameter(name) == null)
return defaultValue;
try {
return Boolean.parseBoolean(request.getParameter(name));
} catch (Exception e) {
return defaultValue;
}
}
/**
* 从Request对象中取出整数
* @param request
* @param name
* @param defaultValue
* @return
*/
public static Integer getIntByRequestParameter(HttpServletRequest request, String name, Integer defaultValue){
if(request == null) return defaultValue;
try {
return Integer.parseInt(request.getParameter(name));
} catch (Exception e) {
return defaultValue;
}
}
/**
* 从Request对象中取出Long整数
* @param request
* @param name
* @param defaultValue
* @return
*/
public static Long getLongByRequestParameter(HttpServletRequest request, String name, Long defaultValue){
if(request == null) return defaultValue;
try {
return Long.parseLong(request.getParameter(name));
} catch (Exception e) {
return defaultValue;
}
}
/**
*
* @param request
* @param isSyncBase64Encoder
* @Deprecated
* @see Webs#getUrl(HttpServletRequest, UrlCodeType)
* @return
*/
public static String getUrl(HttpServletRequest request, boolean isSyncBase64Encoder){
StringBuffer url = new StringBuffer(request.getAttribute("javax.servlet.forward.servlet_path") == null ? request.getRequestURL() : (String)request.getAttribute("javax.servlet.forward.servlet_path"));
String parm = param(request);
if (Strings.hasLength(parm)) {
url.append("?").append(parm);
}
return isSyncBase64Encoder ? Codings.base64Encode(url.toString().getBytes()) : url.toString();
//new String(new BASE64Encoder().encode(url.toString().getBytes()));
}
/**
*
* @param request
* @param urlCodeType
* @return
* @throws UnsupportedEncodingException
*/
public static String getUrl(HttpServletRequest request, UrlCodeType urlCodeType) throws UnsupportedEncodingException{
StringBuffer url = new StringBuffer(request.getAttribute("javax.servlet.forward.servlet_path") == null ? request.getRequestURL() : (String)request.getAttribute("javax.servlet.forward.servlet_path"));
String parm = param(request);
if (Strings.hasLength(parm)) {
url.append("?").append(parm);
}
String result = url.toString();
if(urlCodeType != null)
switch (urlCodeType) {
case BASE64:
return Codings.base64Encode(result.getBytes());
case URLENCODE:
return URLEncoder.encode(result, "UTF-8");
}
return result;
}
/**
* 解码url字符串
* @param url
* @param urlCodeType 编码方式
* @return
* @throws UnsupportedEncodingException
*/
public static String parseUrl(String url, UrlCodeType urlCodeType) throws UnsupportedEncodingException{
if(urlCodeType != null){
switch (urlCodeType) {
case BASE64:
return new String(Codings.base64Decode(url), "UTF-8");
case URLENCODE:
return URLDecoder.decode(url, "UTF-8");
}
}
return url;
}
/**
* 获取URL上的参数,但可以忽略指定的参数
* @param request
* @param ignores
* @return
*/
public static String param(HttpServletRequest request, String...ignoreParams){
StringBuffer url = new StringBuffer();
Enumeration<?> param = request.getParameterNames();//得到所有参数名
Set<String> ignoreSet = ignoreParams.length == 0 ? null : new HashSet<String>(Arrays.asList(ignoreParams));
//如果没有忽略参数,则单独处理以提高性能
if(ignoreSet == null){
while(param.hasMoreElements()){
String pname = param.nextElement().toString();
url.append(pname).append("=").append(request.getParameter(pname)).append("&");
}
}
else{
while(param.hasMoreElements()){
String pname = param.nextElement().toString();
if(ignoreSet.contains(pname)){
continue;
}
url.append(pname).append("=").append(request.getParameter(pname)).append("&");
}
}
if(url.toString().endsWith("&")){
url.deleteCharAt( url.length() - 1 );
}
String result = url.toString();
result = result.replace("\"", "%22").replace("'", "%27").replace("<", "<").replace(">", ">");
return result;
}
public static String getValidateCode(Object scope){
if(scope instanceof HttpSession){
HttpSession session = (HttpSession) scope;
return (String)session.getAttribute("validateCode");
}
if(scope instanceof HttpServletRequest){
HttpServletRequest request = (HttpServletRequest) scope;
return getValidateCode(request.getSession());
}
return null;
}
/**
* 检查验证码
* @param scope 作用域
* @param validateCode 用户输入的验证码
* @return
*/
public static Boolean isValidateCode(Object scope, String validateCode){
return validateCode != null && validateCode.equalsIgnoreCase(getValidateCode(scope));
/*if(scope instanceof HttpSession){
HttpSession session = (HttpSession) scope;
String code = (String)session.getAttribute("validateCode");
return code == null ? false : code.equalsIgnoreCase(validateCode);
}
if(scope instanceof HttpServletRequest){
HttpServletRequest request = (HttpServletRequest) scope;
return isValidateCode(request.getSession(),validateCode);
}
return false;*/
}
/**
* 防止站外连接
* @param request
* @return
*/
public static boolean prohibitOutsideLinking(HttpServletRequest request){
String Referer = "";
boolean referer_sign = true; //true 站内提交,验证通过 //false 站外提交,验证失败
Enumeration<?> headerValues = request.getHeaders("Referer");
while (headerValues.hasMoreElements())
Referer = (String)headerValues.nextElement();
//判断是否存在请求页面
if(Referer == null || Referer.length() < 1 ){
referer_sign = false;
}
else {
//判断请求页面和getRequestURI是否相同
String servername_str = request.getServerName();
if(Strings.hasLengthBytrim(servername_str)){
int index = 0;
if (Strings.indexOf(Referer, "https://")==0){
index = 8;
}
else if (Strings.indexOf(Referer, "http://")==0){
index = 7;
}
if(Referer.length() - index < servername_str.length()) //长度不够
referer_sign = false;
else{ //比较字符串(主机名称)是否相同
String referer_str = Referer.substring(index,index + servername_str.length());
if(!servername_str.equalsIgnoreCase(referer_str))
referer_sign = false;
}
}
else
referer_sign = false;
}
return referer_sign;
}
}