最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java在web頁(yè)面上的編碼解碼處理及中文URL亂碼解決

 更新時(shí)間:2016年02月29日 08:58:12   作者:chenssy  
這篇文章主要介紹了Java在web頁(yè)面上的編碼解碼處理及中文URL亂碼解決,文中所介紹的兩種使用過(guò)濾器解決中文鏈接亂碼的方法非常有效,需要的朋友可以參考下

編碼&解碼
 通過(guò)下圖我們可以了解在javaWeb中有哪些地方有轉(zhuǎn)碼:

201622985247492.gif (617×260)

用戶想服務(wù)器發(fā)送一個(gè)HTTP請(qǐng)求,需要編碼的地方有url、cookie、parameter,經(jīng)過(guò)編碼后服務(wù)器接受HTTP請(qǐng)求,解析HTTP請(qǐng)求,然后對(duì)url、cookie、parameter進(jìn)行解碼。在服務(wù)器進(jìn)行業(yè)務(wù)邏輯處理過(guò)程中可能需要讀取數(shù)據(jù)庫(kù)、本地文件或者網(wǎng)絡(luò)中的其他文件等等,這些過(guò)程都需要進(jìn)行編碼解碼。當(dāng)處理完成后,服務(wù)器將數(shù)據(jù)進(jìn)行編碼后發(fā)送給客戶端,瀏覽器經(jīng)過(guò)解碼后顯示給用戶。在這個(gè)整個(gè)過(guò)程中涉及的編碼解碼的地方較多,其中最容易出現(xiàn)亂碼的位置就在于服務(wù)器與客戶端進(jìn)行交互的過(guò)程。
 上面整個(gè)過(guò)程可以概括成這樣,頁(yè)面編碼數(shù)據(jù)傳遞給服務(wù)器,服務(wù)器對(duì)獲得的數(shù)據(jù)進(jìn)行解碼操作,經(jīng)過(guò)一番業(yè)務(wù)邏輯處理后將最終結(jié)果編碼處理后傳遞給客戶端,客戶端解碼展示給用戶。所以下面我就請(qǐng)求對(duì)javaweb的編碼&解碼進(jìn)行闡述。
請(qǐng)求
 客戶端想服務(wù)器發(fā)送請(qǐng)求無(wú)非就通過(guò)四中情況:
 1、URL方式直接訪問(wèn)。
 2、頁(yè)面鏈接。
 3、表單get提交
 4、表單post提交
URL方式
 對(duì)于URL,如果該URL中全部都是英文的那倒是沒(méi)有什么問(wèn)題,如果有中文就要涉及到編碼了。如何編碼?根據(jù)什么規(guī)則來(lái)編碼?又如何來(lái)解碼呢?下面將一一解答!首先看URL的組成部分:

201622985312692.png (795×222)

在這URL中瀏覽器將會(huì)對(duì)path和parameter進(jìn)行編碼操作。為了更好地解釋編碼過(guò)程,使用如下URL
 http://127.0.0.1:8080/perbank/我是cm?name=我是cm
 將以上地址輸入到瀏覽器URL輸入框中,通過(guò)查看http 報(bào)文頭信息我們可以看到瀏覽器是如何進(jìn)行編碼的。下面是IE、Firefox、Chrome三個(gè)瀏覽器的編碼情況:

201622985337260.png (1129×354)

201622985358250.png (1075×225)

201622985418423.png (654×246)

 可以看到各大瀏覽器對(duì)“我是”的編碼情況如下:


path部分

Query String

Firefox

E6 88 91 E6 98 AF

E6 88 91 E6 98 AF

Chrome

E6 88 91 E6 98 AF

E6 88 91 E6 98 AF

IE

E6 88 91 E6 98 AF

CE D2 CA C7


查閱上篇博客的編碼可知對(duì)于path部分Firefox、chrome、IE都是采用UTF-8編碼格式,對(duì)于Query String部分Firefox、chrome采用UTF-8,IE采用GBK。至于為什么會(huì)加上%,這是因?yàn)閁RL的編碼規(guī)范規(guī)定瀏覽器將ASCII字符非 ASCII 字符按照某種編碼格式編碼成 16 進(jìn)制數(shù)字然后將每個(gè) 16 進(jìn)制表示的字節(jié)前加上“%”。
 當(dāng)然對(duì)于不同的瀏覽器,相同瀏覽器不同版本,不同的操作系統(tǒng)等環(huán)境都會(huì)導(dǎo)致編碼結(jié)果不同,上表某一種情況,對(duì)于URL編碼規(guī)則下任何結(jié)論都是過(guò)早的。由于各大瀏覽器、各個(gè)操作系統(tǒng)對(duì)URL的URI、QueryString編碼都可能存在不同,這樣對(duì)服務(wù)器的解碼勢(shì)必會(huì)造成很大的困擾,下面我們將已tomcat,看tomcat是如何對(duì)URL進(jìn)行解碼操作的。
 解析請(qǐng)求的 URL 是在 org.apache.coyote.HTTP11.InternalInputBuffer 的 parseRequestLine 方法中,這個(gè)方法把傳過(guò)來(lái)的 URL 的 byte[] 設(shè)置到 org.apache.coyote.Request 的相應(yīng)的屬性中。這里的 URL 仍然是 byte 格式,轉(zhuǎn)成 char 是在 org.apache.catalina.connector.CoyoteAdapter 的 convertURI 方法中完成的:

protected void convertURI(MessageBytes uri, Request request) 
    throws Exception { 
     ByteChunk bc = uri.getByteChunk(); 
     int length = bc.getLength(); 
     CharChunk cc = uri.getCharChunk(); 
     cc.allocate(length, -1); 
     String enc = connector.getURIEncoding();  //獲取URI解碼集 
     if (enc != null) { 
      B2CConverter conv = request.getURIConverter(); 
      try { 
       if (conv == null) { 
        conv = new B2CConverter(enc); 
        request.setURIConverter(conv); 
       } 
      } catch (IOException e) {...} 
      if (conv != null) { 
       try { 
        conv.convert(bc, cc, cc.getBuffer().length - cc.getEnd()); 
        uri.setChars(cc.getBuffer(), cc.getStart(), cc.getLength()); 
        return; 
       } catch (IOException e) {...} 
      } 
     } 
     // Default encoding: fast conversion 
     byte[] bbuf = bc.getBuffer(); 
     char[] cbuf = cc.getBuffer(); 
     int start = bc.getStart(); 
     for (int i = 0; i < length; i++) { 
      cbuf[i] = (char) (bbuf[i + start] & 0xff); 
     } 
     uri.setChars(cbuf, 0, length); 
 } 

 從上面的代碼可知,對(duì)URI的解碼操作是首先獲取Connector的解碼集,該配置在server.xml中

<Connector URIEncoding="utf-8" /> 

 如果沒(méi)有定義則會(huì)采用默認(rèn)編碼ISO-8859-1來(lái)解析。
 對(duì)于Query String部分,我們知道無(wú)論我們是通過(guò)get方式還是POST方式提交,所有的參數(shù)都是保存在Parameters,然后我們通過(guò)request.getParameter,解碼工作就是在第一次調(diào)用getParameter方法時(shí)進(jìn)行的。在getParameter方法內(nèi)部它調(diào)用org.apache.catalina.connector.Request 的 parseParameters 方法,這個(gè)方法將會(huì)對(duì)傳遞的參數(shù)進(jìn)行解碼。下面代碼只是parseParameters方法的一部分:

//獲取編碼 
 String enc = getCharacterEncoding(); 
 //獲取ContentType 中定義的 Charset 
 boolean useBodyEncodingForURI = connector.getUseBodyEncodingForURI(); 
 if (enc != null) { //如果設(shè)置編碼不為空,則設(shè)置編碼為enc 
  parameters.setEncoding(enc); 
  if (useBodyEncodingForURI) { //如果設(shè)置了Chartset,則設(shè)置queryString的解碼為ChartSet 
   parameters.setQueryStringEncoding(enc);  
  } 
 } else {  //設(shè)置默認(rèn)解碼方式 
  parameters.setEncoding(org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING); 
  if (useBodyEncodingForURI) { 
   parameters.setQueryStringEncoding(org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING); 
  } 
 } 

 從上面代碼可以看出對(duì)query String的解碼格式要么采用設(shè)置的ChartSet要么采用默認(rèn)的解碼格式ISO-8859-1。注意這個(gè)設(shè)置的ChartSet是在 http Header中定義的ContentType,同時(shí)如果我們需要改指定屬性生效,還需要進(jìn)行如下配置:

<Connector URIEncoding="UTF-8" useBodyEncodingForURI="true"/> 

 上面部分詳細(xì)介紹了URL方式請(qǐng)求的編碼解碼過(guò)程。其實(shí)對(duì)于我們而言,我們更多的方式是通過(guò)表單的形式來(lái)提交。
表單GET
 我們知道通過(guò)URL方式提交數(shù)據(jù)是很容易產(chǎn)生亂碼問(wèn)題的,所以我們更加傾向于通過(guò)表單形式。當(dāng)用戶點(diǎn)擊submit提交表單時(shí),瀏覽器會(huì)更加設(shè)定的編碼來(lái)編碼數(shù)據(jù)傳遞給服務(wù)器。通過(guò)GET方式提交的數(shù)據(jù)都是拼接在URL后面(可以當(dāng)做query String??)來(lái)提交的,所以tomcat服務(wù)器在進(jìn)行解碼過(guò)程中URIEncoding就起到作用了。tomcat服務(wù)器會(huì)根據(jù)設(shè)置的URIEncoding來(lái)進(jìn)行解碼,如果沒(méi)有設(shè)置則會(huì)使用默認(rèn)的ISO-8859-1來(lái)解碼。假如我們?cè)陧?yè)面將編碼設(shè)置為UTF-8,而URIEncoding設(shè)置的不是或者沒(méi)有設(shè)置,那么服務(wù)器進(jìn)行解碼時(shí)就會(huì)產(chǎn)生亂碼。這個(gè)時(shí)候我們一般可以通過(guò)new String(request.getParameter("name").getBytes("iso-8859-1"),"utf-8") 的形式來(lái)獲取正確數(shù)據(jù)。
表單POST
 對(duì)于POST方式,它采用的編碼也是由頁(yè)面來(lái)決定的即contentType。當(dāng)我通過(guò)點(diǎn)擊頁(yè)面的submit按鈕來(lái)提交表單時(shí),瀏覽器首先會(huì)根據(jù)ontentType的charset編碼格式來(lái)對(duì)POST表單的參數(shù)進(jìn)行編碼然后提交給服務(wù)器,在服務(wù)器端同樣也是用contentType中設(shè)置的字符集來(lái)進(jìn)行解碼(這里與get方式就不同了),這就是通過(guò)POST表單提交的參數(shù)一般而言都不會(huì)出現(xiàn)亂碼問(wèn)題。當(dāng)然這個(gè)字符集編碼我們是可以自己設(shè)定的:request.setCharacterEncoding(charset) 。


解決URL中文亂碼問(wèn)題
我們主要通過(guò)兩種形式提交向服務(wù)器發(fā)送請(qǐng)求:URL、表單。而表單形式一般都不會(huì)出現(xiàn)亂碼問(wèn)題,亂碼問(wèn)題主要是在URL上面。通過(guò)前面幾篇博客的介紹我們知道URL向服務(wù)器發(fā)送請(qǐng)求編碼過(guò)程實(shí)在是實(shí)在太混亂了。不同的操作系統(tǒng)、不同的瀏覽器、不同的網(wǎng)頁(yè)字符集,將導(dǎo)致完全不同的編碼結(jié)果。如果程序員要把每一種結(jié)果都考慮進(jìn)去,是不是太恐怖了?有沒(méi)有辦法,能夠保證客戶端只用一種編碼方法向服務(wù)器發(fā)出請(qǐng)求?
 有!這里我主要提供以下幾種方法
javascript
 使用javascript編碼不給瀏覽器插手的機(jī)會(huì),編碼之后再向服務(wù)器發(fā)送請(qǐng)求,然后在服務(wù)器中解碼。在掌握該方法的時(shí)候,我們需要料及javascript編碼的三個(gè)方法:escape()、encodeURI()、encodeURIComponent()。
escape
 采用SIO Latin字符集對(duì)指定的字符串進(jìn)行編碼。所有非ASCII字符都會(huì)被編碼為%xx格式的字符串,其中xx表示該字符在字符集中所對(duì)應(yīng)的16進(jìn)制數(shù)字。例如,格式對(duì)應(yīng)的編碼為%20。它對(duì)應(yīng)的解碼方法為unescape()。

201622985532729.png (334×181)

事實(shí)上escape()不能直接用于URL編碼,它的真正作用是返回一個(gè)字符的Unicode編碼值。比如上面“我是cm”的結(jié)果為%u6211%u662Fcm,其中“我”對(duì)應(yīng)的編碼為6211,“是”的編碼為662F,“cm”編碼為cm。
 注意,escape()不對(duì)"+"編碼。但是我們知道,網(wǎng)頁(yè)在提交表單的時(shí)候,如果有空格,則會(huì)被轉(zhuǎn)化為+字符。服務(wù)器處理數(shù)據(jù)的時(shí)候,會(huì)把+號(hào)處理成空格。所以,使用的時(shí)候要小心。 
encodeURI
 對(duì)整個(gè)URL進(jìn)行編碼,它采用的是UTF-8格式輸出編碼后的字符串。不過(guò)encodeURI除了ASCII編碼外對(duì)于一些特殊的字符也不會(huì)進(jìn)行編碼如:! @ # $& * ( ) = : / ; ? + '。

201622985556654.png (1018×73)

encodeURIComponent
 把URI字符串采用UTF-8編碼格式轉(zhuǎn)化成escape格式的字符串。相對(duì)于encodeURI,encodeURIComponent會(huì)更加強(qiáng)大,它會(huì)對(duì)那些在encodeURI()中不被編碼的符號(hào)(; / ? : @ & = + $ , #)統(tǒng)統(tǒng)會(huì)被編碼。但是encodeURIComponent只會(huì)對(duì)URL的組成部分進(jìn)行個(gè)別編碼,而不用于對(duì)整個(gè)URL進(jìn)行編碼。對(duì)應(yīng)解碼函數(shù)方法decodeURIComponent。
 當(dāng)然我們一般都是使用encodeURI方來(lái)進(jìn)行編碼操作。所謂的javascript兩次編碼后臺(tái)兩次解碼就是使用該方法。javascript解決該問(wèn)題有一次轉(zhuǎn)碼、兩次轉(zhuǎn)碼兩種解決方法。
一次轉(zhuǎn)碼
 javascript轉(zhuǎn)碼:

var url = '<s:property value="webPath" />/ShowMoblieQRCode.servlet?name=我是cm'; 
window.location.href = encodeURI(url); 

 轉(zhuǎn)碼后的URL:http://127.0.0.1:8080/perbank/ShowMoblieQRCode.servlet?name=%E6%88%91%E6%98%AFcm
 后臺(tái)處理:

String name = request.getParameter("name"); 
System.out.println("前臺(tái)傳入?yún)?shù):" + name); 
name = new String(name.getBytes("ISO-8859-1"),"UTF-8"); 
System.out.println("經(jīng)過(guò)解碼后參數(shù):" + name); 

 輸出結(jié)果:
 前臺(tái)傳入?yún)?shù):??????cm
 經(jīng)過(guò)解碼后參數(shù):我是cm
二次轉(zhuǎn)碼
 javascript

var url = '<s:property value="webPath" />/ShowMoblieQRCode.servlet?name=我是cm'; 
window.location.href = encodeURI(encodeURI(url)); 

 轉(zhuǎn)碼后的url:http://127.0.0.1:8080/perbank/ShowMoblieQRCode.servlet?name=%25E6%2588%2591%25E6%2598%25AFcm
 后臺(tái)處理:

String name = request.getParameter("name"); 
System.out.println("前臺(tái)傳入?yún)?shù):" + name); 
name = URLDecoder.decode(name,"UTF-8"); 
System.out.println("經(jīng)過(guò)解碼后參數(shù):" + name); 

 輸出結(jié)果:
 前臺(tái)傳入?yún)?shù):E68891E698AFcm
 經(jīng)過(guò)解碼后參數(shù):我是cm

filter
 使用過(guò)濾器,過(guò)濾器提供兩種,第一種設(shè)置編碼,第二種直接在過(guò)濾器中進(jìn)行解碼操作。
過(guò)濾器1
 該過(guò)濾器是直接設(shè)置request的編碼格式的。

public class CharacterEncoding implements Filter { 
 
 private FilterConfig config ; 
 String encoding = null; 
  
 public void destroy() { 
  config = null; 
 } 
 
 public void doFilter(ServletRequest request, ServletResponse response, 
   FilterChain chain) throws IOException, ServletException { 
  request.setCharacterEncoding(encoding); 
  chain.doFilter(request, response); 
 } 
 
 public void init(FilterConfig config) throws ServletException { 
  this.config = config; 
  //獲取配置參數(shù) 
  String str = config.getInitParameter("encoding"); 
  if(str!=null){ 
   encoding = str; 
  } 
 } 
 
} 

 配置:

<!-- 中文過(guò)濾器的配置 --> 
 <filter> 
  <filter-name>chineseEncoding</filter-name> 
  <filter-class>com.test.filter.CharacterEncoding</filter-class> 
   
  <init-param> 
   <param-name>encoding</param-name> 
   <param-value>utf-8</param-value> 
  </init-param> 
 </filter> 
  
 <filter-mapping> 
  <filter-name>chineseEncoding</filter-name> 
  <url-pattern>/*</url-pattern> 
 </filter-mapping> 

過(guò)濾器2
 該過(guò)濾器在處理方法中將參數(shù)直接進(jìn)行解碼操作,然后將解碼后的參數(shù)重新設(shè)置到request的attribute中。

public class CharacterEncoding implements Filter { 
 protected FilterConfig filterConfig ; 
 String encoding = null; 
  
 public void destroy() { 
  this.filterConfig = null; 
 } 
 
 /** 
  * 初始化 
  */ 
 public void init(FilterConfig filterConfig) { 
  this.filterConfig = filterConfig; 
 } 
 
 /** 
  * 將 inStr 轉(zhuǎn)為 UTF-8 的編碼形式 
  * 
  * @param inStr 輸入字符串 
  * @return UTF - 8 的編碼形式的字符串 
  * @throws UnsupportedEncodingException 
  */ 
 private String toUTF(String inStr) throws UnsupportedEncodingException { 
  String outStr = ""; 
  if (inStr != null) { 
   outStr = new String(inStr.getBytes("iso-8859-1"), "UTF-8"); 
  } 
  return outStr; 
 } 
 
 /** 
  * 中文亂碼過(guò)濾處理 
  */ 
 public void doFilter(ServletRequest servletRequest, 
   ServletResponse servletResponse, FilterChain chain) throws IOException, 
   ServletException { 
  HttpServletRequest request = (HttpServletRequest) servletRequest; 
  HttpServletResponse response = (HttpServletResponse) servletResponse; 
 
  // 獲得請(qǐng)求的方式 (1.post or 2.get), 根據(jù)不同請(qǐng)求方式進(jìn)行不同處理 
  String method = request.getMethod(); 
  // 1. 以 post 方式提交的請(qǐng)求 , 直接設(shè)置編碼為 UTF-8 
  if (method.equalsIgnoreCase("post")) { 
   try { 
    request.setCharacterEncoding("UTF-8"); 
   } catch (UnsupportedEncodingException e) { 
    e.printStackTrace(); 
   } 
  } 
  // 2. 以 get 方式提交的請(qǐng)求 
  else { 
   // 取出客戶提交的參數(shù)集 
   Enumeration<String> paramNames = request.getParameterNames(); 
   // 遍歷參數(shù)集取出每個(gè)參數(shù)的名稱及值 
   while (paramNames.hasMoreElements()) { 
    String name = paramNames.nextElement(); // 取出參數(shù)名稱 
    String values[] = request.getParameterValues(name); // 根據(jù)參數(shù)名稱取出其值 
    // 如果參數(shù)值集不為空 
    if (values != null) { 
     // 遍歷參數(shù)值集 
     for (int i = 0; i < values.length; i++) { 
      try { 
       // 回圈依次將每個(gè)值調(diào)用 toUTF(values[i]) 方法轉(zhuǎn)換參數(shù)值的字元編碼 
       String vlustr = toUTF(values[i]); 
       values[i] = vlustr; 
      } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
      } 
     } 
     // 將該值以屬性的形式藏在 request 
     request.setAttribute(name, values); 
    } 
   } 
 
  } 
  // 設(shè)置響應(yīng)方式和支持中文的字元集 
  response.setContentType("text/html;charset=UTF-8"); 
 
  // 繼續(xù)執(zhí)行下一個(gè) filter, 無(wú)一下個(gè) filter 則執(zhí)行請(qǐng)求 
  chain.doFilter(request, response); 
 } 
} 
 

配置:

<!-- 中文過(guò)濾器的配置 --> 
 <filter> 
  <filter-name>chineseEncoding</filter-name> 
  <filter-class>com.test.filter.CharacterEncoding</filter-class> 
 </filter> 
  
 <filter-mapping> 
  <filter-name>chineseEncoding</filter-name> 
  <url-pattern>/*</url-pattern> 
 </filter-mapping> 

 

其他
 1、設(shè)置pageEncoding、contentType

<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%> 

 2、設(shè)置tomcat的URIEncoding
 在默認(rèn)情況下,tomcat服務(wù)器使用的是ISO-8859-1編碼格式來(lái)編碼的,URIEncoding參數(shù)對(duì)get請(qǐng)求的URL進(jìn)行編碼,所以我們只需要在tomcat的server.xml文件的<Connector>標(biāo)簽中加上URIEncoding="utf-8"即可。

相關(guān)文章

  • 淺談HBase在SpringBoot項(xiàng)目里的應(yīng)用(含HBaseUtil工具類)

    淺談HBase在SpringBoot項(xiàng)目里的應(yīng)用(含HBaseUtil工具類)

    這篇文章主要介紹了淺談HBase在SpringBoot項(xiàng)目里的應(yīng)用(含HBaseUtil工具類),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10
  • Java學(xué)習(xí)之緩沖流的原理詳解

    Java學(xué)習(xí)之緩沖流的原理詳解

    為了提高其數(shù)據(jù)的讀寫(xiě)效率,Java中又定義了四種緩沖流,分別是:字節(jié)緩沖輸入流、字節(jié)緩沖輸出流、字符緩沖輸入流和字符緩沖輸出流。本文主要來(lái)和大家聊聊這些緩沖流的原理,希望對(duì)大家有所幫助
    2023-01-01
  • Java連接MongoDB的常用方法詳解

    Java連接MongoDB的常用方法詳解

    這篇文章主要為大家詳細(xì)介紹一下Java語(yǔ)言連接MongoDB的常用方法以及實(shí)現(xiàn)增刪改查功能的示例代碼,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-07-07
  • SpringCloud災(zāi)難性雪崩效應(yīng)處理方法之降級(jí)實(shí)現(xiàn)流程詳解

    SpringCloud災(zāi)難性雪崩效應(yīng)處理方法之降級(jí)實(shí)現(xiàn)流程詳解

    這篇文章主要介紹了SpringCloud災(zāi)難性雪崩效應(yīng)處理方法之降級(jí),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧<BR>
    2022-11-11
  • Java算法真題詳解運(yùn)用單調(diào)棧

    Java算法真題詳解運(yùn)用單調(diào)棧

    一般使用單調(diào)棧無(wú)非兩個(gè)方向,單調(diào)遞減,單調(diào)遞增。單調(diào)遞增棧:存進(jìn)去的數(shù)據(jù)都是增加的,碰到減少的時(shí)候,這時(shí)就要進(jìn)行操作了。單調(diào)遞減棧:存進(jìn)去的數(shù)據(jù)都是減少的,碰到增加的時(shí)候,這時(shí)就要進(jìn)行操作了,下面我們?cè)谡骖}中運(yùn)用它
    2022-07-07
  • Java Apache Shiro安全框架快速開(kāi)發(fā)詳解流程

    Java Apache Shiro安全框架快速開(kāi)發(fā)詳解流程

    Apache Shiro是一個(gè)強(qiáng)大且易用的Java安全框架,執(zhí)行身份驗(yàn)證、授權(quán)、密碼和會(huì)話管理。使用Shiro的易于理解的API,您可以快速、輕松地獲得任何應(yīng)用程序,從最小的移動(dòng)應(yīng)用程序到最大的網(wǎng)絡(luò)和企業(yè)應(yīng)用程序
    2021-10-10
  • Java8 Zip 壓縮與解壓縮的實(shí)現(xiàn)

    Java8 Zip 壓縮與解壓縮的實(shí)現(xiàn)

    這篇文章主要介紹了Java8 Zip 壓縮與解壓縮的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • maven依賴關(guān)系中的<scope>provided</scope>使用詳解

    maven依賴關(guān)系中的<scope>provided</scope>使用詳解

    這篇文章主要介紹了maven依賴關(guān)系中的<scope>provided</scope>使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 關(guān)于IO密集型服務(wù)提升性能的三種方式

    關(guān)于IO密集型服務(wù)提升性能的三種方式

    這篇文章主要介紹了關(guān)于IO密集型服務(wù)提升性能的三種方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Servlet注解之@WebInitParam多個(gè)InitParam的使用

    Servlet注解之@WebInitParam多個(gè)InitParam的使用

    這篇文章主要介紹了Servlet注解之@WebInitParam多個(gè)InitParam的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04

最新評(píng)論

阿拉善盟| 柘荣县| 富平县| 扶沟县| 福建省| 重庆市| 双鸭山市| 陕西省| 承德市| 根河市| 克山县| 新化县| 平舆县| 广水市| 措美县| 历史| 兰溪市| 密山市| 专栏| 洱源县| 开远市| 石首市| 高淳县| 根河市| 自贡市| 安仁县| 乡宁县| 子洲县| 咸丰县| 湘西| 新兴县| 黄冈市| 咸宁市| 宁晋县| 龙口市| 芮城县| 鄢陵县| 西畴县| 齐齐哈尔市| 贵港市| 莆田市|