package com.kingschan.blog.util;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.safety.Whitelist;
import org.pegdown.Extensions;
import org.pegdown.PegDownProcessor;
import com.fasterxml.uuid.EthernetAddress;
import com.fasterxml.uuid.Generators;
import com.kingschan.blog.common.enums.BLOG_SKIN_PAGE;
import com.kingschan.blog.common.enums.Variable;
import com.kingschan.blog.model.vo.UserVo;
import com.kingschan.blog.po.WebSite;
import com.kingschan.blog.services.impl.CommonServiceImpl;
import eu.bitwalker.useragentutils.UserAgent;
/**
*
*
* 类名称:BlogUtil
* 类描述: 博客工具类
* 创建人:kings.chan
* 创建时间:2016-7-21 上午12:24:52
* 修改人:
* 修改时间:
* 项目:ROOT
* 修改备注:
* @version
*
*/
public class BlogUtil {
private HttpServletRequest req;
public static final String CURRENT_USER = "BLOG_CURRENT_USER";
public BlogUtil(HttpServletRequest p_req){this.req=p_req;}
/**
* 是否已经登录
* @return
*/
public boolean isLogin(){
UserVo u =(UserVo) getSession().getAttribute(CURRENT_USER);
return null==u?false:true;
}
/**
* 得到当前登录的用户
* @return
*/
public UserVo getCurrentUser(){
return (UserVo) getSession().getAttribute(CURRENT_USER);
}
/**
* 得到后台当前博客
* @return
*/
public WebSite getCurrentAdminWebSite(){
return (WebSite) getSession().getAttribute(Variable.SESSION_BLOG_ADMIN_WEBSITE.getKey());
}
/**
* 设置后台当前博客
* @param ws
*/
public void setCurrentAdminWebSite(WebSite ws){
getSession().setAttribute(Variable.SESSION_BLOG_ADMIN_WEBSITE.getKey(),ws);
}
/**
* 得到前端当前博客
* @return
*/
public WebSite getCurrentFontWebSite(){
return (WebSite) getSession().getAttribute(Variable.SESSION_BLOG_WEBSITE.getKey());
}
/**
* 退出
* @param req
*/
public void loginOut(){
String sid=new CookieUtil(req,null).getCookieAttribute("JSESSIONID");
if (null!=sid&&sid.matches("\\w{32}")) {
try {
CommonServiceImpl serv=SpringUtil.getBean("CommonServiceImpl");
HttpSession session=(HttpSession) serv.getCache(Variable.CACHE_CONTENT_SESSION.getKey(), sid);
if (null!=session) {
session.invalidate();
}
serv.removeCache(Variable.CACHE_CONTENT_SESSION.getKey(), sid);
} catch (Exception e) {
e.printStackTrace();
}
}else{
req.getSession().invalidate();
}
}
/**
* set sina referer
* @param url
*/
public void setSinaLoginReferer(String url){
getSession().setAttribute("referer",url.matches(".*/entry/\\w{32}(.html)?")?url.concat("#commentDiv"):url);
}
/**
* sina login referer
* @return
*/
public String getSinaLoginReferer(){
Object ref=getSession().getAttribute("referer");
return null==ref?String.format("redirect:http://%s.51so.info", getCurrentFontWebSite().getWebsiteName()):ref.toString();
}
/**
* 得到博客对应的模板
* @param template_key
* @param isFontSite 是否前端
* @return
*/
public String getTemplate(BLOG_SKIN_PAGE template_key,Boolean isFontSite){
String skin=isFontSite?getCurrentFontWebSite().getWebsiteSkin():getCurrentAdminWebSite().getWebsiteSkin();
return String.format(template_key.getPath(), skin);
}
/**
* 得到session
* @return
*/
public HttpSession getSession(){
String sid=new CookieUtil(req,null).getCookieAttribute("JSESSIONID");
HttpSession session=null;
if (null!=sid&&sid.matches("\\w{32}")) {
try {
CommonServiceImpl serv=SpringUtil.getBean("CommonServiceImpl");
session=(HttpSession) serv.getCache(Variable.CACHE_CONTENT_SESSION.getKey(), sid);
if (null==session) {
session=req.getSession();
}
} catch (Exception e) {
e.printStackTrace();
}
}else{
session=req.getSession();
}
return session;
}
/**
* 得到定户端IP地址
* @param request
* @return
*/
public static String getClientIP(HttpServletRequest request) {
String ipAddress = null;
ipAddress = request.getHeader("x-forwarded-for");
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("Proxy-Client-IP");
}
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("WL-Proxy-Client-IP");
}
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getRemoteAddr();
}
// 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
if (ipAddress != null && ipAddress.length() > 15) { // "***.***.***.***".length() = 15
if (ipAddress.indexOf(",") > 0) {
ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
}
}
return ipAddress;
}
/**
* 得到代理工具访问对象
* @return
*/
public UserAgent getUserAgent(){
return UserAgent.parseUserAgentString(req.getHeader("User-Agent"));
}
/**
* 当前访问是否是机器人
* @return
*/
public boolean isRobot(){
return getUserAgent().getOperatingSystem().getName().equals("Unknown");
}
/**
* 清理掉记录的登录信息
* @param req
* @param res
* @param domain cookie share domain sample:.51so.info
*/
public void clearLoginCookies(HttpServletRequest req, HttpServletResponse res,String domain) {
CookieUtil cu = new CookieUtil(req, res);
cu.removeCookie(domain,Variable.COOKIE_USERNAME_KEY.getKey());
cu.removeCookie(domain,Variable.COOKIE_PSW_KEY.getKey());
cu.removeCookie(domain,Variable.COOKIE_JSESSIONID.getKey());
}
/**
* 得到文章避编辑器
* @param type
* @return
*/
public String getArticleEditorTemplate(String type){
return type.equalsIgnoreCase("html")?
"/admin/article/article_edit_ueditor":"/admin/article/article_edit_markdown";
}
/**
* 得到安全的提交字符串 jsoup basic
* @param content
* @return
*/
public static String getSafeSubmitString(String content){
return Jsoup.clean(content, Whitelist.basic());
}
/**
* 过滤xss攻击
* @param content
* @return
*/
public static String filterXss(String content){
if (StringUtils.isNotEmpty(content)) {
try {
return StringEscapeUtils.escapeHtml(URLDecoder.decode(content, "utf-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return null;
}
/**
* 把markdown转成html
* @param content
* @return
*/
public static String markDownToHtml(String content){
PegDownProcessor pegDownProcessor = new PegDownProcessor(Extensions.ALL_OPTIONALS | Extensions.ALL_WITH_OPTIONALS, 5000);
return pegDownProcessor.markdownToHtml(content);
}
/**
* 评论时 at 用户名格式化
* @param content
* @return
*/
public static String atUserFormat(String content){
Pattern pattern = Pattern.compile("\\@\\w+");
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
String hit=matcher.group();
if (!hit.trim().isEmpty()) {
content=content.replace(hit, String.format("<a class=\"atlink\">%s</a>", hit));
}
}
return content;
}
public static UUID getUUIDByTimeBase(){
return Generators.timeBasedGenerator(EthernetAddress.fromInterface()).generate();
}
public static void main(String[] args) {
for (int i = 0; i < 20; i++) {
UUID uuid =BlogUtil.getUUIDByTimeBase();
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(uuid.timestamp()/1000000*100);
cal.add(Calendar.YEAR, 1582-1970);
cal.add(Calendar.MONTH, 10);
cal.add(Calendar.DAY_OF_MONTH, 15);
//输出2017-03-15 10:20:34,其实当前系统时间是2017-02-10 10:20:34 时间上还是有误差
String time=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(cal.getTime());
System.out.println(String.format("%s|%s|%s", uuid.toString(),uuid.timestamp(),time));
}
}
}