springboot實(shí)現(xiàn)支付寶支付案例

做了一個(gè)測(cè)試案例狂秦,用的沙箱測(cè)試賬號(hào)
可以去支付寶官網(wǎng)注冊(cè)一個(gè)開(kāi)發(fā)者賬號(hào),獲取沙箱賬號(hào)悬赏,地址: https://openhome.alipay.com/platform/appDaily.htm?tab=info
注冊(cè)完之后會(huì)看到以下畫(huà)面:

支付寶支付沙箱應(yīng)用

支付寶支付沙箱賬號(hào)

上面兩個(gè)圖中脓匿,我們可以看到有這個(gè)幾個(gè)有用的信息:
1.APPID
2.支付寶網(wǎng)關(guān)
3.商家賬號(hào) 登錄密碼
4.買(mǎi)家賬號(hào) 登錄密碼 支付密碼

接下來(lái)压鉴,我們?cè)谏诚鋺?yīng)用里要設(shè)置一下RSA2公鑰
首先下載生成公鑰和私鑰的工具,地址:https://opendocs.alipay.com/open/291/105971#LDsXr

支付寶支付公鑰生成工具

如上圖骤坐,只有windows版和macOs版绪杏,用linux的心疼一秒鐘,還好我有windows虛擬機(jī)纽绍。
支付寶支付公鑰生成

如上圖蕾久,安裝之后,點(diǎn)擊生成秘鑰即可生成公鑰和私鑰拌夏,復(fù)制保存好這個(gè)公鑰和私鑰
接下來(lái)更改沙箱應(yīng)用中RSA2的公鑰僧著,把剛剛生成的公鑰復(fù)制到在線網(wǎng)站上保存。
支付寶支付保存公鑰到在線網(wǎng)站

到現(xiàn)在為止障簿,準(zhǔn)備工作已經(jīng)做完了盹愚。

在springboot上創(chuàng)建一個(gè)AlipayConfig類

package com.zhaohy.app.config;

import java.io.FileWriter;
import java.io.IOException;

public class AlipayConfig {
    // 應(yīng)用ID,您的APPID,收款賬號(hào)既是您的APPID對(duì)應(yīng)支付寶賬號(hào)
    public static String APP_ID = "";

    // 商戶私鑰站故,您的PKCS8格式RSA2私鑰皆怕,這些就是我們剛才設(shè)置的
    public static String RSA_PRIVATE_KEY = "";

    // 支付寶公鑰,查看地址:https://openhome.alipay.com/platform/keyManage.htm
    // 對(duì)應(yīng)APPID下的支付寶公鑰。,這些就是我們剛才設(shè)置的
    public static String ALIPAY_PUBLIC_KEY = "";

    // 異步通知愈腾,再這里我們?cè)O(shè)計(jì)自己的后臺(tái)代碼
    public static String notify_url = "http://www.zhaohy.org.cn";

    // 頁(yè)面跳轉(zhuǎn)同步通知頁(yè)面路徑 需http://格式的完整路徑朗兵,不能加?id=123這類自定義參數(shù),必須外網(wǎng)可以正常訪問(wèn)
    public static String return_url = "http://www.zhaohy.org.cn";

    // 簽名方式
    public static String SIGN_TYPE = "RSA2";

    // 字符編碼格式
    public static String CHARSET = "utf-8";

    // 支付寶網(wǎng)關(guān) https://openapi.alipaydev.com/gateway.do https://openapi.alipay.com/gateway.do
    public static String GATEWAYURL = "https://openapi.alipaydev.com/gateway.do";

    // 支付寶網(wǎng)關(guān)
    public static String LOG_PATH = "/home/zhaohy/alipayLog/";
    
    public static String FORMAT = "json";

    // ↑↑↑↑↑↑↑↑↑↑請(qǐng)?jiān)谶@里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

    /**
     * 寫(xiě)日志顶滩,方便測(cè)試(看網(wǎng)站需求余掖,也可以改成把記錄存入數(shù)據(jù)庫(kù))
     * 
     * @param sWord 要寫(xiě)入日志里的文本內(nèi)容
     */
    public static void logResult(String sWord) {
        FileWriter writer = null;
        try {
            writer = new FileWriter(LOG_PATH + "alipay_log_" + System.currentTimeMillis() + ".txt");
            writer.write(sWord);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (writer != null) {
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

把之前的appid,公鑰,私鑰和網(wǎng)關(guān)地址都填在上面代碼里

新建AlipayService類

package com.zhaohy.app.service;

import com.alipay.api.AlipayApiException;

public interface AlipayService {
    /**
     * web端訂單支付
     * 
     * @param outTradeNo  訂單編號(hào)(唯一)
     * @param totalAmount 訂單價(jià)格
     * @param subject     商品名稱
     */
    String webPagePay(String outTradeNo, Integer totalAmount, String subject) throws Exception;

    /**
     * app端訂單支付
     * 
     * @param outTradeNo  訂單編號(hào)
     * @param totalAmount 訂單價(jià)格
     * @param subject     商品名稱
     */
    String appPagePay(String outTradeNo, Integer totalAmount, String subject) throws Exception;

    /**
     * 退款
     * 
     * @param outTradeNo   訂單編號(hào)
     * @param refundReason 退款原因
     * @param refundAmount 退款金額
     * @param outRequestNo 標(biāo)識(shí)一次退款請(qǐng)求礁鲁,同一筆交易多次退款需要保證唯一盐欺,如需部分退款,則此參數(shù)必傳
     */
    String refund(String outTradeNo, String refundReason, Integer refundAmount, String outRequestNo)
            throws AlipayApiException;

    /**
     * 交易查詢
     * 
     * @param outTradeNo 訂單編號(hào)(唯一)
     */
    String query(String outTradeNo) throws AlipayApiException;

    /**
     * 交易關(guān)閉
     * 
     * @param outTradeNo訂單編號(hào)(唯一)
     */
    String close(String outTradeNo) throws AlipayApiException;

    /**
     * 退款查詢
     * 
     * @param outTradeNo   訂單編號(hào)(唯一)
     * @param outRequestNo 標(biāo)識(shí)一次退款請(qǐng)求仅醇,同一筆交易多次退款需要保證唯一冗美,如需部分退款,則此參數(shù)必傳
     */
    String refundQuery(String outTradeNo, String outRequestNo) throws AlipayApiException;
}

新建AlipayServiceImpl實(shí)現(xiàn)類

package com.zhaohy.app.service.impl;

import java.util.HashMap;
import java.util.Map;

import org.springframework.stereotype.Service;

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeWapPayModel;
import com.alipay.api.request.AlipayTradeCloseRequest;
import com.alipay.api.request.AlipayTradeFastpayRefundQueryRequest;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.request.AlipayTradeWapPayRequest;
import com.zhaohy.app.config.AlipayConfig;
import com.zhaohy.app.service.AlipayService;
import com.zhaohy.app.utils.AppFrameworkUtil;
@Service("AlipayService")
public class AlipayServiceImpl implements AlipayService {

    /** 調(diào)取支付寶接口 web端支付 */
    DefaultAlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.GATEWAYURL, AlipayConfig.APP_ID,
            AlipayConfig.RSA_PRIVATE_KEY, "json", AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,
            AlipayConfig.SIGN_TYPE);

    /** 調(diào)取支付寶接口app端支付 */
    AlipayClient alipayClients = new DefaultAlipayClient(AlipayConfig.GATEWAYURL, AlipayConfig.APP_ID,
            AlipayConfig.RSA_PRIVATE_KEY, "json", AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,
            AlipayConfig.SIGN_TYPE);

    /**
     * web端訂單支付
     * 
     * @param outTradeNo  訂單編號(hào)(唯一)
     * @param totalAmount 訂單價(jià)格
     * @param subject     商品名稱
     */
    @Override
    public String webPagePay(String outTradeNo, Integer totalAmount, String subject) throws Exception {

        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        /** 同步通知析二,支付完成后粉洼,支付成功頁(yè)面 */
        alipayRequest.setReturnUrl(AlipayConfig.return_url);
        /** 異步通知,支付完成后叶摄,需要進(jìn)行的異步處理 */
        alipayRequest.setNotifyUrl(AlipayConfig.notify_url);

        Map<String, String> bizContentMap = new HashMap<String, String>();
        bizContentMap.put("out_trade_no", outTradeNo);
        bizContentMap.put("total_amount", totalAmount + "");
        bizContentMap.put("subject", subject);
        bizContentMap.put("body", "商品名稱");
        bizContentMap.put("timeout_express", "90m");
        bizContentMap.put("product_code", "FAST_INSTANT_TRADE_PAY");
        String bizContentJson = AppFrameworkUtil.structureConfigParamsGroupJSONDataWithOutSimpleResultBean(bizContentMap);
        alipayRequest.setBizContent(bizContentJson);

        /** 轉(zhuǎn)換格式 */
        String result = alipayClient.pageExecute(alipayRequest).getBody().replace('\"', '\'').replace('\n', ' ');
        return result;
    }

    /**
     * 退款
     * 
     * @param outTradeNo   訂單編號(hào)
     * @param refundReason 退款原因
     * @param refundAmount 退款金額
     * @param outRequestNo 標(biāo)識(shí)一次退款請(qǐng)求属韧,同一筆交易多次退款需要保證唯一,如需部分退款蛤吓,則此參數(shù)必傳
     */
    @Override
    public String refund(String outTradeNo, String refundReason, Integer refundAmount, String outRequestNo)
            throws AlipayApiException {
        AlipayTradeRefundRequest alipayRequest = new AlipayTradeRefundRequest();

        /** 調(diào)取接口 */
        alipayRequest.setBizContent("{\"out_trade_no\":\"" + outTradeNo + "\"," + "\"refund_amount\":\"" + refundAmount
                + "\"," + "\"refund_reason\":\"" + refundReason + "\"," + "\"out_request_no\":\"" + outRequestNo
                + "\"}");
        String result = alipayClient.execute(alipayRequest).getBody();
        return result;
    }

    /**
     * 交易查詢
     * 
     * @param outTradeNo 訂單編號(hào)(唯一)
     */
    @Override
    public String query(String outTradeNo) throws AlipayApiException {
        AlipayTradeQueryRequest alipayRequest = new AlipayTradeQueryRequest();
        /** 請(qǐng)求接口 */
        alipayRequest.setBizContent("{\"out_trade_no\":\"" + outTradeNo + "\"," + "\"trade_no\":\"" + "" + "\"}");
        /** 轉(zhuǎn)換格式 */
        String result = alipayClient.execute(alipayRequest).getBody();
        return result;
    }

    /**
     * 交易關(guān)閉
     * 
     * @param outTradeNo訂單編號(hào)(唯一)
     */
    @Override
    public String close(String outTradeNo) throws AlipayApiException {
        AlipayTradeCloseRequest alipayRequest = new AlipayTradeCloseRequest();

        alipayRequest.setBizContent("{\"out_trade_no\":\"" + outTradeNo + "\"," + "\"trade_no\":\"" + "" + "\"}");

        String result = alipayClient.execute(alipayRequest).getBody();

        return result;
    }

    /**
     * 退款查詢
     * 
     * @param outTradeNo   訂單編號(hào)(唯一)
     * @param outRequestNo 標(biāo)識(shí)一次退款請(qǐng)求宵喂,同一筆交易多次退款需要保證唯一,如需部分退款会傲,則此參數(shù)必傳
     */
    @Override
    public String refundQuery(String outTradeNo, String outRequestNo) throws AlipayApiException {
        AlipayTradeFastpayRefundQueryRequest alipayRequest = new AlipayTradeFastpayRefundQueryRequest();

        /** 請(qǐng)求接口 */
        alipayRequest.setBizContent(
                "{\"out_trade_no\":\"" + outTradeNo + "\"," + "\"out_request_no\":\"" + outRequestNo + "\"}");

        /** 格式轉(zhuǎn)換 */
        String result = alipayClient.execute(alipayRequest).getBody();

        return result;
    }

    /**
     * app端訂單支付
     * 
     * @param outTradeNo  訂單編號(hào)
     * @param totalAmount 訂單價(jià)格
     * @param subject     商品名稱
     */
    @Override
    public String appPagePay(String outTradeNo, Integer totalAmount, String subject) throws Exception {
        AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();

        /** 同步通知锅棕,支付完成后,支付成功頁(yè)面 */
        alipayRequest.setReturnUrl(AlipayConfig.return_url);
        /** 異步通知淌山,支付完成后裸燎,需要進(jìn)行的異步處理 */
        alipayRequest.setNotifyUrl(AlipayConfig.notify_url);

        /** 銷售產(chǎn)品碼(固定) */
        String productCode = "QUICK_WAP_WAY";

        /** 進(jìn)行賦值 */
        AlipayTradeWapPayModel wapPayModel = new AlipayTradeWapPayModel();
        wapPayModel.setOutTradeNo(outTradeNo);
        wapPayModel.setSubject(subject);
        wapPayModel.setTotalAmount(totalAmount.toString());
        wapPayModel.setBody("商品名稱");
        wapPayModel.setTimeoutExpress("2m");
        wapPayModel.setProductCode(productCode);
        alipayRequest.setBizModel(wapPayModel);

        /** 格式轉(zhuǎn)換 */
        String result = alipayClients.pageExecute(alipayRequest).getBody().replace('\"', '\'').replace('\n', ' ');
        return result;
    }

}

新建AlipayController

package com.zhaohy.app.controller;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.zhaohy.app.service.AlipayService;
import com.zhaohy.app.utils.AppFrameworkUtil;
@Controller
public class AlipayController {
    @Autowired
    private AlipayService alipayService;
    
    @RequestMapping("/alipayTest.do")
    public String test(HttpServletRequest request) {
        request.setAttribute("ctx", AppFrameworkUtil.getWebRootUrl(request, ""));
        return "html/alipay";
    }

    /**
     * web 訂單支付
     */
    @RequestMapping("/alipay/getPagePay")
    public void getPagePay(HttpServletRequest request, HttpServletResponse response) throws Exception {
        /** 模仿數(shù)據(jù)庫(kù),從后臺(tái)調(diào)數(shù)據(jù) */
        String outTradeNo = "19960310621211";
        Integer totalAmount = 1;
        String subject = "蘋(píng)果28";

        String pay = alipayService.webPagePay(outTradeNo, totalAmount, subject);
        System.out.println(pay);

        Map<Object, Object> resultMap = new HashMap<>();
        resultMap.put("data", pay);

        AppFrameworkUtil.renderJSON(response, AppFrameworkUtil.structureConfigParamsGroupJSONData(resultMap));
    }

    /**
     * app 訂單支付
     */
    @RequestMapping("/alipay/getAppPagePay")
    public void getAppPagePay(HttpServletRequest request, HttpServletResponse response) throws Exception {
        /** 模仿數(shù)據(jù)庫(kù)泼疑,從后臺(tái)調(diào)數(shù)據(jù) */
        String outTradeNo = "1312332";
        Integer totalAmount = 1000;
        String subject = "天貓超市014";

        String pay = alipayService.appPagePay(outTradeNo, totalAmount, subject);

        System.out.println(pay);
        Map<Object, Object> resultMap = new HashMap<>();
        resultMap.put("data", pay);
        AppFrameworkUtil.renderJSON(response, AppFrameworkUtil.structureConfigParamsGroupJSONData(resultMap));

    }

    /**
     * 交易查詢
     */
    @RequestMapping("/alipay/aipayQuery")
    public void alipayQuery(HttpServletRequest request, HttpServletResponse response) throws Exception {
        /** 調(diào)取支付訂單號(hào) */
        String outTradeNo = "13123";

        String query = alipayService.query(outTradeNo);

        //Object json = JSONObject.toJSON(query);

        /*
         * JSONObject jObject = new JSONObject(); jObject.get(query);
         */
        AppFrameworkUtil.renderJSON(response, query);
    }

    /**
     * 退款
     * 
     * @throws AlipayApiException
     */
    @RequestMapping("/alipay/alipayRefund")
    public void alipayRefund(HttpServletRequest request, HttpServletResponse response) throws AlipayApiException {
        String outTradeNo = request.getParameter("outTradeNo");
        String outRequestNo = request.getParameter("outRequestNo");
        String refundAmount = request.getParameter("refundAmount");
        /** 調(diào)取數(shù)據(jù) */
        // String outTradeNo = "15382028806591197";
        String refundReason = "用戶不想購(gòu)買(mǎi)";
        // refundAmount = 1;
        // outRequestNo = "22";

        String refund = alipayService.refund(outTradeNo, refundReason, Integer.parseInt(refundAmount), outRequestNo);

        System.out.println(refund);

        AppFrameworkUtil.renderJSON(response, refund);
    }

    /**
     * 退款查詢
     * 
     * @throws AlipayApiException
     */
    @RequestMapping("/alipay/refundQuery")
    public void refundQuery(HttpServletRequest request, HttpServletResponse response) throws AlipayApiException {

        /** 調(diào)取數(shù)據(jù) */
        String outTradeNo = "13123";
        String outRequestNo = "2";

        String refund = alipayService.refundQuery(outTradeNo, outRequestNo);

        AppFrameworkUtil.renderJSON(response, refund);

    }

    /**
     * 交易關(guān)閉
     * 
     * @throws AlipayApiException
     */
    @RequestMapping("/alipay/alipayclose")
    public void alipaycolse(HttpServletRequest request, HttpServletResponse response) throws AlipayApiException {

        /** 調(diào)取數(shù)據(jù) */
        String outTradeNo = "13123";

        String close = alipayService.close(outTradeNo);

        AppFrameworkUtil.renderJSON(response, close);
    }
}

controller里getAppPagePay是app訂單支付德绿,里面寫(xiě)死的是測(cè)試數(shù)據(jù),如果正式用王浴,可以當(dāng)參數(shù)傳進(jìn)來(lái)脆炎。
演示app 訂單支付,因?yàn)閍pp訂單支付會(huì)跳轉(zhuǎn)到支付寶進(jìn)行登錄支付氓辣,如果沒(méi)有監(jiān)測(cè)到支付寶應(yīng)用秒裕,則用網(wǎng)頁(yè)版的支付寶進(jìn)行支付,會(huì)比較方便钞啸。
調(diào)用上面的/alipayTest.do接口會(huì)跳轉(zhuǎn)到html/alipay.html頁(yè)面
alipay.html代碼如下:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script th:src="@{${ctx} + '/js/jquery/jquery-3.2.1.min.js'}"></script>
<script th:src="@{${ctx} + '/js/common/common.js'}"></script>

<script>
$(function(){
    let url = "http://127.0.0.1:8082/alipay/getAppPagePay";
    let params = {}
    let result = getData(params, url);
    console.log(result)
    $("#alipay").html(result.data);
})
function getData(dataArr, url){
    let results = null;
    $.ajax({
        url:url,
        data:JSON.stringify(dataArr),
        contentType:'application/json',
        dataType:'json',
        async:false,
        type:'post',
        beforeSend: function(request) {
            if(!booleanEmpty(localStorage.getItem("token"))){
                request.setRequestHeader("token", localStorage.getItem("token"));
            }
        },
        success:function(result){
            if("403" == result.result_code){
                alert(result.result_msg);
                window.location.href = $("#rootPath").val() + "/user/loginPage.do"
            } else{
                results = result.data;
            }
        },
        complete:function (){  //在數(shù)據(jù)加載完成之后几蜻,要?jiǎng)h除掉 正在加載的dom
        }
    });
    
    return results;
};
</script>
</head>
<body>
    <div id="alipay"></div>
</body>


</html>

可以看到喇潘,一進(jìn)來(lái)這個(gè)頁(yè)面會(huì)請(qǐng)求app訂單支付接口,那個(gè)接口會(huì)返回一個(gè)form表單梭稚,并提交給支付寶進(jìn)行支付颖低,那個(gè)form表單的html放到#alipay div中便會(huì)自動(dòng)執(zhí)行跳轉(zhuǎn).

啟動(dòng)項(xiàng)目,訪問(wèn)http://127.0.0.1:8082/alipayTest.do

支付寶支付跳轉(zhuǎn)頁(yè)面

如圖弧烤,電腦訪問(wèn)跳轉(zhuǎn)到了上圖頁(yè)面忱屑,點(diǎn)擊繼續(xù)瀏覽器付款,登錄沙箱買(mǎi)家賬號(hào)暇昂,輸入支付密碼即可
支付寶支付付款頁(yè)面

點(diǎn)擊確認(rèn)付款莺戒,輸入密碼
image

幾秒鐘后會(huì)跳轉(zhuǎn)回AlipayConfig里面設(shè)置的http:www.zhaohy.org.cn
支付寶支付跳轉(zhuǎn)回頁(yè)面

至此,整個(gè)支付過(guò)程已經(jīng)完成~

=====2021年7月19日更新=====

補(bǔ)充一下AppFrameworkUtil工具類

package com.zhaohy.app.utils;

import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.nio.charset.UnsupportedCharsetException;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.imageio.ImageIO;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.ibatis.session.SqlSession;
import org.springframework.context.ApplicationContext;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.zhaohy.app.service.UserService;

import flexjson.JSONSerializer;
import nl.bitwalker.useragentutils.UserAgent;
public class AppFrameworkUtil {
    /**
     * 四舍五入急波。保留num個(gè)小數(shù)點(diǎn)后的數(shù)字
     * 
     * @param bh
     * @param num
     * @return
     */
    public static String getNum(double bh, int num) {
        String numstr = "";
        numstr = new BigDecimal(bh).setScale(num, BigDecimal.ROUND_HALF_UP) + "";
        return numstr;
    }

    /**
     * 去替換橫杠
     * 
     * @param str
     * @param t_str
     * @return
     */
    public static String getReplaseStr(String str) {
        String t_str = null;
        if (str != null) {
            t_str = str.replace("-", "");
        }
        return t_str;
    }

    /**
     * 四舍五入从铲。保留num個(gè)小數(shù)點(diǎn)后的數(shù)字
     * 
     * @param bh
     * @param num
     * @return
     */
    public static String getNum(String bh, int num) {

        if (AppFrameworkUtil.isEmpty(bh) || "-".equals(bh))
            return "-";
        if ("0.0".equals(bh) || "0".equals(bh))
            return bh;
        String numstr = "";
        numstr = new BigDecimal(Double.parseDouble(bh)).setScale(num, BigDecimal.ROUND_HALF_UP) + "";
        return numstr;
    }

    /**
     * 字符串空判斷
     * 
     * @param str
     * @return
     */
    public static boolean isEmpty(String str) {
        boolean flag = true;
        if (null != str && 0 != str.trim().length())
            flag = false;
        return flag;
    }

    /**
     * 添加符號(hào)
     * 
     * @param str
     */
    public static String addSign(String str) {
        if (!AppFrameworkUtil.isEmpty(str) && !str.contains("-")) {
            str = "+" + str;
        }
        return str;
    }

    /**
     * 添加千分位
     * 
     * @param str
     * @return
     */
    public static String format(String str) {
        if (!isEmpty(str) && !"-".equals(str)) {
            DecimalFormat df = new DecimalFormat("###,###");
            try {
                str = df.format(Long.parseLong(str));
            } catch (Exception e) {
                return str;
            }
        }
        return str;
    }

    /**
     * response JSON數(shù)據(jù)
     * 
     * @param response
     * @param context
     */
    public static void renderJSON(HttpServletResponse response, String context) {
        PrintWriter out = null;
        try {
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/json");
            out = response.getWriter();
            out.write(context);
            out.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            out.close();
        }
    }

    /**
     * 獲取外網(wǎng)IP
     * 
     * @param request
     * @return
     */
    public static String getRemoteHost(HttpServletRequest request) {
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        return ip.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ip;
    }

    public static String getSystemDate() {
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String curDate = s.format(calendar.getTime()); // 當(dāng)前日期
        return curDate;
    }

    /**
     * 
     * @param str
     * @return
     */
    public static boolean isBlank(String str) {
        return (str == null || str.trim().length() == 0 || str.equals("undefined") || str.equals("null"));
    }

    /**
     * 序列化集合成JSON字符
     * @param list
     * @return
     */
    @SuppressWarnings("unchecked")
    public static String structureConfigParamsGroupJSONData(Object obj) {
        JSONSerializer serializer = new JSONSerializer();
        String json = "";
        @SuppressWarnings("rawtypes")
        SimpleResultBean result = new SimpleResultBean();
        result.setData(obj);
        json = serializer.exclude("*.class").deepSerialize(result).replaceAll(":\\s*null\\s*", ":\"\"");
        return json;
    }
    
    public static String structureConfigParamsGroupJSONDataWithOutSimpleResultBean(Object obj) {
        JSONSerializer serializer = new JSONSerializer();
        String json = "";
        json = serializer.exclude("*.class").deepSerialize(obj).replaceAll(":\\s*null\\s*", ":\"\"");
        return json;
    }

    /**
     * 返回jsonObj參數(shù)
     * 
     * @param request
     * @return
     */
    public static JSONObject getRequestParamsObj(HttpServletRequest request) {
        JSONObject paramsObj = new JSONObject();
        try {
            BufferedReader streamReader = new BufferedReader(new InputStreamReader(request.getInputStream(), "UTF-8"));
            StringBuilder responseStrBuilder = new StringBuilder();
            String inputStr;
            while ((inputStr = streamReader.readLine()) != null)
                responseStrBuilder.append(inputStr);

            paramsObj = JSONObject.parseObject(responseStrBuilder.toString());

        } catch (Exception e) {
            e.printStackTrace();
        }
        return paramsObj;
    }

    /**
     * 判斷是否是ajax請(qǐng)求
     * 
     * @param request
     * @return
     */
    public static boolean isAjax(HttpServletRequest request) {
        String accept = request.getHeader("accept");
        if (accept != null && accept.indexOf("application/json") != -1) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 
     * 獲取用戶mac地址
     * 
     * @param ip
     * @return
     */
    public static String getMacAddrByIp(String ip) {
        String macAddr = null;
        try {
            String command = "nbtstat -a ";
            if (!System.getProperty("os.name").contains("Windows")) {
                command = "netstat -a ";
            }
            Process process = Runtime.getRuntime().exec(command + ip);
            BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
            Pattern pattern = Pattern.compile("([A-F0-9]{2}-){5}[A-F0-9]{2}");
            Matcher matcher;
            for (String strLine = br.readLine(); strLine != null; strLine = br.readLine()) {
                matcher = pattern.matcher(strLine);
                if (matcher.find()) {
                    macAddr = matcher.group();
                    break;
                }
            }
        } catch (IOException e) {
            // e.printStackTrace();
        }
        return macAddr;
    }

    /**
     * 獲取系統(tǒng)os名稱
     * 
     * @param request
     * @return
     */
    public static String getOSName(HttpServletRequest request) {
        String osName = null;
        try {
            String userAgentStr = request.getHeader("User-Agent");
            UserAgent userAgent = UserAgent.parseUserAgentString(userAgentStr);
            osName = userAgent.getOperatingSystem().getName();
        } catch (Exception e) {

        }

        return osName;
    }

    /**
     * 獲取請(qǐng)求系統(tǒng)os名稱
     * 
     * @param request
     * @return
     */
    public static Object getOSVersion(HttpServletRequest request) {
        Object osVersion = null;
        try {
            String userAgentStr = request.getHeader("User-Agent");
            UserAgent userAgent = UserAgent.parseUserAgentString(userAgentStr);
            osVersion = userAgent.getOperatingSystem().getId();
        } catch (Exception e) {

        }
        return osVersion;
    }

    /**
     * 獲取請(qǐng)求瀏覽器名稱
     * 
     * @param request
     * @return
     */
    public static String getBrowserName(HttpServletRequest request) {
        String name = null;
        try {
            String userAgentStr = request.getHeader("User-Agent");
            UserAgent userAgent = UserAgent.parseUserAgentString(userAgentStr);
            name = userAgent.getBrowser().getName();
        } catch (Exception e) {

        }
        return name;
    }

    /**
     * 獲取請(qǐng)求瀏覽器版本
     * 
     * @param request
     * @return
     */
    public static String getBrowserVersion(HttpServletRequest request) {
        String version = null;
        try {
            String userAgentStr = request.getHeader("User-Agent");
            UserAgent userAgent = UserAgent.parseUserAgentString(userAgentStr);
            version = userAgent.getBrowserVersion().getVersion();
        } catch (Exception e) {

        }
        return version;
    }

    public static String getDevTypeById(String appType) {
        String name = "";
        if ("1".equals(appType)) {
            name = "IPAD";
        } else if ("5".equals(appType)) {
            name = "IPHONE";
        } else if ("6".equals(appType)) {
            name = "ANDROID";
        }
        return name;
    }

    public static String formatLanguageType(String languageType) {
        String value = "zh";
        if (!AppFrameworkUtil.isBlank(languageType)) {
            if ("ja".equals(languageType)) {
                value = "ja";
            }
        }
        return value;
    }

    /**
     * txt格式轉(zhuǎn)String
     * 
     * @param txtPath
     * @return
     * @throws IOException
     */
    public static String txtToStr(String txtPath) throws IOException {
        StringBuffer buffer = new StringBuffer();
        BufferedReader bf = new BufferedReader(new InputStreamReader(new FileInputStream(txtPath), "UTF-8"));
        String str = null;
        while ((str = bf.readLine()) != null) {// 使用readLine方法,一次讀一行
            buffer.append(new String(str.getBytes(), "UTF-8"));
        }

        String xml = buffer.toString();

        return xml;
    }

    public static boolean booleanUtf8(String txtPath) {
        boolean flag = false;
        // 原本這里的是gb2312澄暮,為了兼容更多名段,選擇了gbk
        String code = "gbk";
        byte[] head = new byte[3];
        try {
            File file = new File(txtPath);
            InputStream inputStream = new FileInputStream(file);
            inputStream.read(head);
            if (head[0] == -1 && head[1] == -2) {
                code = "UTF-16";
            } else if (head[0] == -2 && head[1] == -1) {
                code = "Unicode";
            } else if (head[0] == -17 && head[1] == -69 && head[2] == -65) {
                code = "UTF-8";
            }
            inputStream.close();

            //System.out.println(code);
            if (code.equals("UTF-8")) {
                flag = true;
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return flag;
    }

    public static boolean booleanUtf8(File file) {
        boolean flag = false;
        // 原本這里的是gb2312,為了兼容更多泣懊,選擇了gbk
        String code = "gbk";
        byte[] head = new byte[3];
        try {
            InputStream inputStream = new FileInputStream(file);
            inputStream.read(head);
            if (head[0] == -1 && head[1] == -2) {
                code = "UTF-16";
            } else if (head[0] == -2 && head[1] == -1) {
                code = "Unicode";
            } else if (head[0] == -17 && head[1] == -69 && head[2] == -65) {
                code = "UTF-8";
            }
            inputStream.close();

            //System.out.println(code);
            if (code.equals("UTF-8")) {
                flag = true;
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return flag;
    }

    public static boolean upLoadFile(File file, String pdfPath) {
        boolean flag = false;
        File dirFile = new File(pdfPath);
        try {
            if (!dirFile.exists()) {
                dirFile.createNewFile();
            }
            flag = true;
        } catch (IOException e) {
            e.printStackTrace();
            flag = false;
        }

        InputStream input = null;
        FileOutputStream output = null;
        try {
            input = new FileInputStream(file);
            output = new FileOutputStream(dirFile);
            byte[] bt = new byte[1024 * 1024 * 200];// 最大200m
            int len = 0;
            while ((len = input.read(bt)) != -1) {
                output.write(bt, 0, len);
            }

            flag = true;
            input.close();
            output.flush();
            output.close();
        } catch (IOException e) {
            flag = false;
            e.printStackTrace();
        }
        return flag;
    }

    /**
     * 分頁(yè)查詢
     * 
     * @param request
     * @param paramsMap
     * @param list
     * @param sqlSession
     * @param string
     * @return
     */
    public static List<Map<String, Object>> pagedQuery(HttpServletRequest request, Map<String, Object> paramsMap,
            List<Map<String, Object>> list, SqlSession sqlSession, String queryPosition) {
        int pageIndex = Integer.parseInt(paramsMap.get("pageIndex").toString());// 當(dāng)前頁(yè)
        int pageIndexSize = Integer.parseInt(paramsMap.get("pageIndexSize").toString());// 一頁(yè)條數(shù)
        int beginNum = pageIndex * pageIndexSize - pageIndexSize;
        int endNum = pageIndex * pageIndexSize;
        int totalNum = 0;// 總條數(shù)
        int pageCount = 0;// 總頁(yè)數(shù)
        paramsMap.put("beginNum", beginNum);
        paramsMap.put("endNum", endNum);
        list = new ArrayList<Map<String, Object>>();
        list = sqlSession.selectList(queryPosition, paramsMap);
        if (list.size() > 0) {
            totalNum = Integer.parseInt(list.get(0).get("TOTALNUM").toString());
            if (totalNum > pageIndexSize) {
                if (((double) totalNum / (double) pageIndexSize) > (double) (totalNum / pageIndexSize)) {
                    pageCount = totalNum / pageIndexSize + 1;
                } else {
                    pageCount = totalNum / pageIndexSize;
                }
            } else {
                pageCount = 1;
            }
        }
        paramsMap.put("pageCount", pageCount);// 總頁(yè)數(shù)
        paramsMap.put("totalNum", totalNum);// 總條數(shù)
        return list;
    }

    public static void downloadFile(File file, HttpServletRequest request, HttpServletResponse response,
            String fileName, String fileType) {
        boolean success = false;
        /* 設(shè)置文件ContentType類型伸辟,這樣設(shè)置,會(huì)自動(dòng)判斷下載文件類型 */
        response.setContentType("multipart/form-data");
        // response.setContentType("application/OCTET-STREAM;charset=UTF-8");
        /* 設(shè)置文件頭:最后一個(gè)參數(shù)是設(shè)置下載文件名 */

        try {
            String formFileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
            response.setHeader("Content-Disposition", "attachment;filename=" + formFileName + "." + fileType);

            InputStream fis = new FileInputStream(file);
            OutputStream os = response.getOutputStream();
            byte[] b = new byte[1024 * 1024 * 200];
            int len;
            while ((len = fis.read(b)) > 0) {
                os.write(b, 0, len);
            }
            os.flush();
            os.close();
            fis.close();

            success = true;
        } catch (Exception e) {
            success = false;
            e.printStackTrace();
        }

    }

    // 處理導(dǎo)出的excel文件中的空格變成+號(hào)的問(wèn)題
    public static String encodeExcelName(String excelName) {
        try {
            excelName = URLEncoder.encode(excelName, "utf-8");
            excelName = excelName.replace("+", "%20");
        } catch (final IOException e) {
            e.printStackTrace();
            // throw e;
        } finally {
        }
        return excelName;
    }

    /**
     * 參數(shù)加引號(hào)處理
     * 
     * @param value
     * @return
     */
    public static String addQuotesToParameter(String ids) {
        if (!AppFrameworkUtil.isBlank(ids)) {
            String[] idsArr = ids.split(",");
            if (idsArr.length > 0) {
                StringBuffer idBuffer = new StringBuffer();
                for (int i = 0; i < idsArr.length; i++) {
                    idBuffer.append("'" + idsArr[i] + "',");
                }
                ids = idBuffer.toString().substring(0, idBuffer.toString().length() - 1);
            }
        }
        return ids;
    }

    /**
     * 把string字符串寫(xiě)入文件
     * @param html
     * @param htmlPath
     * @param string
     * @return
     */
    public static boolean writeStrToFile(String str, String path, String fileName) {
        boolean success = false;
        File dir = new File(path);
        if(!dir.exists()) {
            dir.mkdirs();
        }
        File file = new File(path + fileName);
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
       // byte bytes[] = new byte[1024 * 1024 * 200];
       // bytes = str.getBytes();
       // int b = bytes.length; // 是字節(jié)的長(zhǎng)度嗅定,不是字符串的長(zhǎng)度
       // FileOutputStream fos;
     // 獲取該文件的緩沖輸出流
        BufferedWriter bufferedWriter = null;
        // 寫(xiě)入信息
        try {
            bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
            bufferedWriter.write(str);
            bufferedWriter.flush();// 清空緩沖區(qū)
            bufferedWriter.close();// 關(guān)閉輸出流
            success = true;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
       
        /*
         * try {
         * fos = new FileOutputStream(file);
         * fos.write(bytes);
         * fos.flush();
         * fos.close();
         * success = true;
         * } catch (Exception e) {
         * // TODO Auto-generated catch block
         * e.printStackTrace();
         * }
         */
        return success;
    }

    /**
     * 前端訪問(wèn)路徑
     * @param request
     * @param path
     * @return
     */
    public static String getCommonUrl(HttpServletRequest request, String path) {
//        String scheme = request.getScheme();//http
//        String serverName = request.getServerName();//localhost
//        int serverPort = request.getServerPort();//8080
//        String contextPath = request.getContextPath();//項(xiàng)目名
//        String commonUrl = scheme+"://"+serverName+":"+serverPort+contextPath + "/" + PropertiesUtils.getWEB_STATICFILE_URL() + "/" + path;
        String commonUrl = PropertiesUtils.getCOMMON_URL() + PropertiesUtils.getWEB_STATICFILE_URL() + "/" + path;
        return commonUrl;
    }
    
    public static String getWebRootUrl(HttpServletRequest request, String path) {
//        String scheme = request.getScheme();//http
//        String serverName = request.getServerName();//localhost
//        int serverPort = request.getServerPort();//8080
//        String contextPath = request.getContextPath();//項(xiàng)目名
//        String commonUrl = scheme+"://"+serverName+":"+serverPort+contextPath + "/" + path;
        String commonUrl = PropertiesUtils.getCOMMON_URL() + path;
        return commonUrl;
    }

    /**
     * 過(guò)濾文件名特殊字符
     * @param string
     * @return
     */
    public static String getFileNameFilterSpecialCharacters(String fileName) {
        if(!AppFrameworkUtil.isBlank(fileName)) {
            fileName = fileName.replace("\\", "").replace("/", "")
            .replace(":", "").replace("*", "").replace("?", "").replace("\"", "").replace("<", "")
            .replace(">", "").replace("|", "");
        }
        return fileName;
    }

    public static String formateDateType(HttpServletRequest request, String dateType) {
        String requestType = null == request.getParameter("requestType") ? "pc" : request.getParameter("requestType");
        if("app".equals(requestType)) {
            dateType = null == dateType ? "" : dateType;
        } else {
            dateType = null == dateType ? "4" : dateType;
        }
        return dateType;
    }

    /**
     * 店選中id勾選
     * @param request
     * @param paramsMap
     * @param checkIds
     * @param json 
     * @return
     */
    public static String getDealerBoxCheck(HttpServletRequest request, Map<String, Object> paramsMap, String checkIds, String json) {
        if(!AppFrameworkUtil.isBlank(checkIds)) {
            String[] checkIdsArr = checkIds.split(",");
            JSONObject jsonObj = JSONObject.parseObject(json);
            JSONObject dataObj = jsonObj.getJSONObject("data");
            JSONArray dataArr = dataObj.getJSONArray("data");
            
            for(int i = 0; i < dataArr.size(); i++) {
                JSONObject dataObj1 = dataArr.getJSONObject(i);
                JSONArray childrenArr = dataObj1.getJSONArray("children");
                for(int j = 0; j < childrenArr.size(); j++) {
                    JSONObject childrenObj = childrenArr.getJSONObject(j);
                    JSONArray childrenArr1 = childrenObj.getJSONArray("children");
                    for(int k = 0; k < childrenArr1.size(); k++) {
                        JSONObject childrenObj1 = childrenArr1.getJSONObject(k);
                        JSONArray childrenArr2 = childrenObj1.getJSONArray("children");
                        for(int l = 0; l < childrenArr2.size(); l++) {
                            JSONObject childrenObj2 = childrenArr2.getJSONObject(l);
                            childrenObj2.put("checked", false);
                        }
                        childrenObj1.put("checked", false);
                    }
                    childrenObj.put("checked", false);
                }
                dataObj1.put("checked", false);
            }
            
  first:for(int i = 0; i < dataArr.size(); i++) {
                JSONObject dataObj1 = dataArr.getJSONObject(i);
                for(int m = 0; m < checkIdsArr.length; m++) {
                    if(checkIdsArr[m].equals(dataObj1.getString("value"))) {
                        dataObj1.put("checked", true);
                        break first;
                    }
                }
                JSONArray childrenArr = dataObj1.getJSONArray("children");
                for(int j = 0; j < childrenArr.size(); j++) {
                    JSONObject childrenObj = childrenArr.getJSONObject(j);
                    for(int m = 0; m < checkIdsArr.length; m++) {
                        if(checkIdsArr[m].equals(childrenObj.getString("value"))) {
                            childrenObj.put("checked", true);
                            dataObj1.put("checked", true);
                            break first;
                        }
                    }
                    JSONArray childrenArr1 = childrenObj.getJSONArray("children");
                    for(int k = 0; k < childrenArr1.size(); k++) {
                        JSONObject childrenObj1 = childrenArr1.getJSONObject(k);
                        for(int m = 0; m < checkIdsArr.length; m++) {
                            if(checkIdsArr[m].equals(childrenObj1.getString("value"))) {
                                childrenObj1.put("checked", true);
                                childrenObj.put("checked", true);
                                dataObj1.put("checked", true);
                                break first;
                            }
                        }
                        JSONArray childrenArr2 = childrenObj1.getJSONArray("children");
                        for(int l = 0; l < childrenArr2.size(); l++) {
                            JSONObject childrenObj2 = childrenArr2.getJSONObject(l);
                            for(int m = 0; m < checkIdsArr.length; m++) {
                                if(checkIdsArr[m].equals(childrenObj2.getString("value"))) {
                                    childrenObj2.put("checked", true);
                                    childrenObj1.put("checked", true);
                                    childrenObj.put("checked", true);
                                    dataObj1.put("checked", true);
                                    break first;
                                }
                            }
                        }
                    }
                }
            }
            json = jsonObj.toJSONString();
        }
        return json;
    }

    public static String getUserId(HttpServletRequest request) {
        String userId = "";
        String token = AppFrameworkUtil.getTokenFromRequest(request);
        
        ServletContext context = request.getServletContext();
        ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);
        StringRedisTemplate redisTemplate = ctx.getBean(StringRedisTemplate.class);
        
        if(!AppFrameworkUtil.isBlank(redisTemplate.opsForValue().get(token))) {
            JSONObject userObj = JSONObject.parseObject(redisTemplate.opsForValue().get(token));
            userId = userObj.get("USER_ID").toString();
        }
        return userId;
    }
    
    public static String getUserTypeId(HttpServletRequest request) {
        String userTypeId = "";
        String token = AppFrameworkUtil.getTokenFromRequest(request);
        
        ServletContext context = request.getServletContext();
        ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);
        StringRedisTemplate redisTemplate = ctx.getBean(StringRedisTemplate.class);
        
        if(!AppFrameworkUtil.isBlank(redisTemplate.opsForValue().get(token))) {
            JSONObject userObj = JSONObject.parseObject(redisTemplate.opsForValue().get(token));
            userTypeId = userObj.get("USER_TYPE_ID").toString();
        }
        return userTypeId;
    }

    public static String getUserName(HttpServletRequest request) {
        String userName = "";
        String token = AppFrameworkUtil.getTokenFromRequest(request);
        
        ServletContext context = request.getServletContext();
        ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);
        StringRedisTemplate redisTemplate = ctx.getBean(StringRedisTemplate.class);
        
        if(!AppFrameworkUtil.isBlank(redisTemplate.opsForValue().get(token))) {
            JSONObject userObj = JSONObject.parseObject(redisTemplate.opsForValue().get(token));
            userName = userObj.get("USER_NAME").toString();
        }
        return userName;
    }

    public static String getTokenFromRequest(HttpServletRequest request) {
        String token = null;
        if(null != request.getHeader("token")) {
            token = request.getHeader("token");
        }
        if(token == null) {
            token = request.getParameter("token");
        }
        
        ServletContext context = request.getServletContext();
        ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);
        StringRedisTemplate redisTemplate = ctx.getBean(StringRedisTemplate.class);
        
        if(!AppFrameworkUtil.isBlank(token)) {
            //去redis里找是否存在token
            if(AppFrameworkUtil.isBlank(redisTemplate.opsForValue().get(token))) {
                token = null;
            }
//          String userId = JWTUtil.verifyToken(token);
//          String value = null;
//          try {
//              value = PropertiesUtils.getPropertiesFromFile(AppFrameworkUtil.getLoginDateKey(userId));
//          } catch (IOException e) {
//              value = null;
//              e.printStackTrace();
//          }
//          userId = JWTUtil.verifyToken(token, value);
//          if(null == userId) {
//              return null;
//          }
//          ServletContext context = request.getServletContext();
//            ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);
//            UserService userService = ctx.getBean(UserService.class);
//            List<Map<String, Object>> list = userService.getUserByUserId(request, userId);
//            if(list.size() > 0) {
//              request.getSession().setAttribute(PropertiesUtils.getUSERSTR(), list);
//            } else {
//              token = null;
//            }
        } else {//如果沒(méi)傳token進(jìn)來(lái)自娩,去看看redis里有沒(méi)這個(gè)瀏覽器的sessionId
            String sessionId = request.getSession().getId();
            if(!AppFrameworkUtil.isBlank(redisTemplate.opsForValue().get(sessionId))) {
                token = redisTemplate.opsForValue().get(sessionId);
            }
        }
        if(AppFrameworkUtil.isBlank(token)) {
            token = "";
        }
        return token;
    }
    
    //public static void main(String[] args) {

        /*
         * List<String> list = pdfPathToImagePaths("D://pdf/PowerPoint2013簡(jiǎn)介.pdf");
         * for (int i = 0; i < list.size(); i++) {
         * System.out.println("path==" + list.get(i));
         * }
         */

        /*
         * String userPwd = "&";
         * try {
         * userPwd =URLEncoder.encode(userPwd, "UTF-8");
         * } catch (UnsupportedEncodingException e) {
         * // TODO Auto-generated catch block
         * e.printStackTrace();
         * }
         * System.out.println(userPwd);
         */
    //}

    public static String getLoginDateKey(String userId) {
        if(!AppFrameworkUtil.isBlank(userId)) {
            return userId + "LOGIN_DATE";
        } else {
            return null;
        }
    }

    public static String getLoginDateValue(HttpServletRequest request, String userId) {
        if(!AppFrameworkUtil.isBlank(userId)) {
            return CookieUtil.getCookieByName(request, AppFrameworkUtil.getLoginDateKey(userId));
        }
        return null;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末用踩,一起剝皮案震驚了整個(gè)濱河市渠退,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌脐彩,老刑警劉巖碎乃,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異惠奸,居然都是意外死亡梅誓,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)佛南,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)梗掰,“玉大人,你說(shuō)我怎么就攤上這事嗅回〖八耄” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵绵载,是天一觀的道長(zhǎng)埂陆。 經(jīng)常有香客問(wèn)我苛白,道長(zhǎng),這世上最難降的妖魔是什么焚虱? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任购裙,我火速辦了婚禮,結(jié)果婚禮上鹃栽,老公的妹妹穿的比我還像新娘躏率。我一直安慰自己,他們只是感情好民鼓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布禾锤。 她就那樣靜靜地躺著,像睡著了一般摹察。 火紅的嫁衣襯著肌膚如雪恩掷。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,610評(píng)論 1 305
  • 那天供嚎,我揣著相機(jī)與錄音黄娘,去河邊找鬼。 笑死克滴,一個(gè)胖子當(dāng)著我的面吹牛逼争,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播劝赔,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼誓焦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了着帽?” 一聲冷哼從身側(cè)響起杂伟,我...
    開(kāi)封第一講書(shū)人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仍翰,沒(méi)想到半個(gè)月后赫粥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡予借,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年越平,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灵迫。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡秦叛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瀑粥,到底是詐尸還是另有隱情挣跋,我是刑警寧澤,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布利凑,位于F島的核電站浆劲,受9級(jí)特大地震影響嫌术,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜牌借,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一婶肩、第九天 我趴在偏房一處隱蔽的房頂上張望葛峻。 院中可真熱鬧玄糟,春花似錦堰氓、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至够吩,卻和暖如春比然,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背周循。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工强法, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人湾笛。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓饮怯,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親嚎研。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蓖墅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容