日前有個job Fail拋送EmptyResultDataAccessException,因為有組套設計故update會有多筆相符狀況,去爬了文找找發現是UPDATE的機制造成的。
解決方式: 使用 setAssertUpdates(boolean); 設定成FALSE後排除,不過使用上還是得依照Table Schema設計,若無多筆會符合情況下還是保留預設會比較安全。
日前有個job Fail拋送EmptyResultDataAccessException,因為有組套設計故update會有多筆相符狀況,去爬了文找找發現是UPDATE的機制造成的。
近期處理個需求需要在產出的PDF上面加上章戳圖,專案使用的是iTextPDF所以爬了些文找到了這方式,很順利的處理需求!! 做個備忘。
近期配合保留原始資料將class資料轉json sting 存到DB的blob欄位內,底下是JAVA取值用的邏輯備忘下,試了許多方式就這樣最精簡也符合需要。
至於為什麼選擇blob而不用clob這個主要是考量若干資安掃描會去檢查cloumn data是否有踩紅線,改bytes array可以省去不必要的困擾,不然blob通常拿來存圖或是編譯後的檔案(PDF),這類json string存clob在DB tools上會較方便識別,就看各自的需要囉!!
source json data:
bldata value is new Gson().toJson(Variable.class).getBytes("utf-8")
Read
select bldata from table where length(bldata) > 4 with ur;
Blob blob = resultSet.getBlob("bldata");
byte[] bdata= blob.getBytes(1, (int) blob.length());
Variable.class Variables jsonStr = new Gson().fromJson(new String(bdata), Variable.class);
近日碰到了個需求,要整併外部的JAR到專案中,不過對方的JAR SIZE數十MB而自已所需要的只是裡面其中一個函式,故放入lib呼叫會造成專案封裝後的SIZE大增,不太OK~所以找到了ProcessBuilder這個好用的solution來,底下做個備忘囉!!
完工後的結果如下,效果如預期的方向呈現,OK的!
最近查一個bug從browser提交給AP,一個AJAX結果AP的console.log 看到兩次呼叫的紀錄,後來發現是多OPTIONS的請求,所以記錄下!!
從歷程看單一提交會有兩次的LOG,
年初因故將專案做了源碼掃描CHECKMARX,依照相關報告調整邏輯結果還是殘留了150左右的中高風險卡住了,近幾個月在上JAVA 11開發者的課程,補強了些JAVA的基本常識(=.= 做中學只能保證功能正確效率OK但語法是否能把該語言優勢發揮出來就難說了),再次挑戰雖然中高風險一就是150左右,但數據卻是顛倒過來,哈...
裡面的中、低風險有一堆是System.out.print() 、轉存檔案的風險,這主要是抓錯用的寫LOG或是不會被執行的項目,就先放著吧!! 等找到能騙過CHECKMARK說那段不會被跑到的寫法,應該就解決了。
專案管理是MAVRN、架構為MVC 若干的高風險都是在參數內容檢核時的風險,可以透過加Fitter時去觸發檢查XSS跟SQL Injection的邏輯! XssAndSqlHttpServletRequestWrapper 來複寫後再送入GOOGLE拿去檢索可以看到許多範例。
<filter>CHECKMARK對於資料編碼使用會PASS的
JAVA:
用HtmlUtils.htmlEscape(value) ,之前用URLEncoder.encode(value) 會被無視。
如果邏輯使用StringUtils.isNotBlank() 判斷是否再處理,從報告上看也會被跳過,這時候就得先處理好null的情況後把StringUtils.isNotBlank()拿掉直接強制一定會落入檢核的method才能PASS。
JSP
用 value = org.apache.commons.text.StringEscapeUtils.escapeHtml4(value); 有用,非escapeHtml一就會報錯。
至於SQL Injection大概就是認關鍵字吧,把一些會誤殺的拿掉後多次嘗試即可! 這就不分享了畢竟每個專案環境跟用途不一樣,直接套用GG的機率頗高。
最近幫位新手(非新人)解Bug說專案跑不起來,顯示
姓名跟住址這類資料存取往往都會跟CharSet有關,如果某個環節沒弄好就是亂碼+破版來回報,做個備忘嚕!!
String CharSet = "UTF-8";
byte[] bytes_rowdata = s_addr.getBytes(CharSet );
String s_Addr = ArrayCopy2Str(bytes_rowdata, 0, 11, 20, CharSet );
/*
* i_posstr: 相對起始位置
* i_offset: 偏移位
* len: 取的字元長度
* CharSet: 字元編碼
*/
private String ArrayCopy2Str(byte[] bytes_rowdata, int i_posstr, int i_offset, int len, String CharSet ) {
當系統開發運行趨於穩定後,使用者開始對UI/UX的需求就會趨向積極,恩恩...對單純的Programmer來說,美感永遠不是得優先強化的項目,當然嘔心瀝血做了好幾天更新上的版面,被吐槽到爆炸的評語帶來的挫折也不是一天兩天就能平復的,總之...依賴第三方套見是個不錯的選擇。
SWEETALERT2 可支援BootStrap是不錯的選擇,官網上的範例也很豐富大概常用的情境都有了,要更炫目的也有但使用者口味是會被養刁的,不要隨便做害人(舉某系統說他有位啥你沒有)害己(其他業管的系統為啥沒有)的決定。
取代alert();
Swal.fire("訊息","Hello world.","error");
取代comfirm();
Swal.fire({
最近BarCode128 不夠用了,隨著硬體設備(掃描器)跟標籤機增購所以QRCode也上了時程,做個JAVA iTextPDF產製QRCODE的備忘文章。
import java.util.HashMap;
import java.util.Map;
import com.itextpdf.text.pdf.qrcode.EncodeHintType;
import com.itextpdf.text.pdf.qrcode.ErrorCorrectionLevel;
import com.itextpdf.text.pdf.BarcodeQRCode;
//QRCODE
StringBuffer sb = new StringBuffer ();
sb.append ("QRCODE內容");
Map<EncodeHintType, Object> qrParam = new HashMap<EncodeHintType, Object> ();
qrParam.put ( EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M );
qrParam.put ( EncodeHintType.CHARACTER_SET, "UTF-8" );
//size_x, size_y 為QRCODE寬跟高
BarcodeQRCode qrcode = new BarcodeQRCode ( sb.toString (), size_x, size_y, qrParam );
Image qrcode_img = qrcode.getImage();
InputStream input = new FileInputStream("source.pdf");
OutputStream output= new FileOutputStream(new File("target.pdf"));
PdfReader reader = new PdfReader(input);
PdfStamper stamper = new PdfStamper(reader, output);
PdfContentByte cb = stamper.getOverContent(1);
//x,y 放置在PDF內的座標位置
qrcode_img.setAbsolutePosition(x, y);
cb.addImage(qrcode_img);
stamper.setFormFlattening(true);
stamper.close();
reader.close();