/**
 *
 */
package org.howsun.util;

import java.util.Enumeration;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.howsun.util.security.Codings;

/**
 * 说明:<br>
 * Web层工具
 * @author 张纪豪
 * @version
 * Build Time Feb 23, 2009
 */
public class Servlets {


	/**
	 * 从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;
		}
	}

	/**
	 * 编码URL
	 * @param request
	 * @return
	 */
	public static String enUrlByRequest(HttpServletRequest request){
		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 new String(Codings.base64Encode(url.toString().getBytes()));
	}

	/**
	 * base64编码
	 * @param url
	 * @return
	 */
	public static String enStringToBase64(String url){
		return new String(Codings.base64Encode(url.getBytes()));
	}

	/**
	 * base64解码
	 * @param url
	 * @return
	 */
	public static String deBase64ToString(String url){
		return deUrl(url);
	}

	/**
	 * 还原URL地址
	 * @param url
	 * @return
	 */
	public static String deUrl(String url){//这个是还原方法
		if(url == null) return "";
		try {
			return new String(Codings.base64Decode(url));
		} catch (Exception e) {
			return "";
		}
	}

	/**
	 * 获取URL上的参数
	 * @param request
	 * @return
	 */
	public static String param(HttpServletRequest request){
		StringBuffer url = new StringBuffer("");
		Enumeration<?> param = request.getParameterNames();//得到所有参数名
		while(param.hasMoreElements()){
			String pname = param.nextElement().toString();
			url.append(pname).append("=").append(request.getParameter(pname)).append("&");
		}
		if(url.toString().endsWith("&")){
			url.deleteCharAt(url.length()-1);
		}
		return url.toString();
	}


	/**
	 * 检查验证码
	 * @param scope //作用域
	 * @param validateCode  //用户输入的验证码
	 * @return
	 */
	public static Boolean isValidateCode(Object scope, String validateCode){
		if(scope instanceof HttpSession){
			HttpSession session = (HttpSession) scope;
			String code = (String)session.getAttribute("validateCode");
			return code == null ? false : code.equals(validateCode);
		}

		if(scope instanceof HttpServletRequest){
			HttpServletRequest request = (HttpServletRequest) scope;
			return isValidateCode(request.getSession(),validateCode);
		}
		return false;
	}

	public static Cookie getCookie(HttpServletRequest request, String name){
		Cookie cooikes[] = request.getCookies();
		if(cooikes != null)
		for(Cookie cookie : cooikes){
			if(name.equals(cookie.getName())){
				return cookie;
			}
		}
		return null;
	}
	public static String getCookieValue(HttpServletRequest request, String name){
		Cookie cookie = getCookie(request, name);
		return cookie != null ? cookie.getValue() : null;
	}

	public static void setCookie(HttpServletResponse response, Cookie cookie){
		response.addCookie(cookie);
	}

	/**
	 *
	 * @param response
	 * @param name
	 * @param value
	 * @param domain
	 * @param expiry 有效期(秒)
	 * @param uri
	 */
	public static void setCookieValue(HttpServletResponse response, String name, String value, String domain, Integer expiry, String uri){
		Cookie cookie = new Cookie(name, value);
		if(domain != null){
			cookie.setDomain(domain);
		}
		if(expiry != null){
			cookie.setMaxAge(expiry);
		}
		if(uri != null){
			cookie.setPath(uri);
		}
		response.addCookie(cookie);
	}

	/**
	 * 防止站外连接
	 * @param request
	 * @return
	 */
	public static boolean validate(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 ){
			return false;
		}

		//判断请求页面和getRequestURI是否相同
		String servername_str = request.getServerName();
		if(servername_str != null && servername_str.length() > 0){
			int index = 0;
			if(referer.startsWith("https://")){
				index = 8;
			}
			else if (referer.startsWith("https//")){
				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;
	}

}