精灵王
- 注册日期2010-12-08
- 发帖数640
- QQ
- 火币1103枚
- 粉丝120
- 关注75
|
阅读:3288回复:0
JspSmart之upload组件源码及使用-JSP教程,Jsp/Servlet
楼主#
更多
发布于:2011-01-08 20:25
 | |  |  | jspsmart之upload组件源码主要包括了5个java文件 file.javaimport java.io.bytearrayinputstream; import java.io.fileoutputstream; import java.io.ioexception; import java.math.biginteger; import java.sql.resultset; import java.sql.sqlexception; import javax.servlet.servletexception;// referenced classes of package com.jspsmart.upload: // smartuploadexception, smartuploadpublic class file {private smartupload m_parent; private int m_startdata; private int m_enddata; private int m_size; private string m_fieldname; private string m_filename; private string m_fileext; private string m_filepathname; private string m_contenttype; private string m_contentdisp; private string m_typemime; private string m_subtypemime; private string m_contentstring; private boolean m_ismissing; public static final int saveas_auto = 0; public static final int saveas_virtual = 1; public static final int saveas_physical = 2;file() { m_startdata = 0; m_enddata = 0; m_size = 0; m_fieldname = new string(); m_filename = new string(); m_fileext = new string(); m_filepathname = new string(); m_contenttype = new string(); m_contentdisp = new string(); m_typemime = new string(); m_subtypemime = new string(); m_contentstring = new string(); m_ismissing = true; }public void saveas(string s) throws ioexception, smartuploadexception { saveas(s, 0); }public void saveas(string s, int i) throws ioexception, smartuploadexception { string s1 = new string(); s1 = m_parent.getphysicalpath(s, i); if(s1 == null) throw new illegalargumentexception("there is no specified destination file (1140)."); try { java.io.file file = new java.io.file(s1); fileoutputstream fileoutputstream = new fileoutputstream(file); fileoutputstream.write(m_parent.m_binarray, m_startdata, m_size); fileoutputstream.close(); } catch(ioexception ioexception) { throw new smartuploadexception("file cant be saved (1120)."); } }public void filetofield(resultset resultset, string s) throws servletexception, ioexception, smartuploadexception, sqlexception { long l = 0l; int i = 0x10000; int j = 0; int k = m_startdata; if(resultset == null) throw new illegalargumentexception("the recordset cannot be null (1145)."); if(s == null) throw new illegalargumentexception("the columnname cannot be null (1150)."); if(s.length() == 0) throw new illegalargumentexception("the columnname cannot be empty (1155)."); l = biginteger.valueof(m_size).divide(biginteger.valueof(i)).longvalue(); j = biginteger.valueof(m_size).mod(biginteger.valueof(i)).intvalue(); try { for(int i1 = 1; (long)i1 < l; i1++) { resultset.updatebinarystream(s, new bytearrayinputstream(m_parent.m_binarray, k, i), i); k = k != 0 ? k : 1; k = i1 * i + m_startdata; }if(j > 0) resultset.updatebinarystream(s, new bytearrayinputstream(m_parent.m_binarray, k, j), j); } catch(sqlexception sqlexception) { byte abyte0[] = new byte[m_size]; system.arraycopy(m_parent.m_binarray, m_startdata, abyte0, 0, m_size); resultset.updatebytes(s, abyte0); } catch(exception exception) { throw new smartuploadexception("unable to save file in the database (1130)."); } }public boolean ismissing() { return m_ismissing; }public string getfieldname() { return m_fieldname; }public string getfilename() { return m_filename; }public string getfilepathname() { return m_filepathname; }public string getfileext() { return m_fileext; }public string getcontenttype() { return m_contenttype; }public string getcontentdisp() { return m_contentdisp; }public string getcontentstring() { string s = new string(m_parent.m_binarray, m_startdata, m_size); return s; }public string gettypemime() throws ioexception { return m_typemime; }public string getsubtypemime() { return m_subtypemime; }public int getsize() { return m_size; }protected int getstartdata() { return m_startdata; }protected int getenddata() { return m_enddata; }protected void setparent(smartupload smartupload) { m_parent = smartupload; }protected void setstartdata(int i) { m_startdata = i; }protected void setenddata(int i) { m_enddata = i; }protected void setsize(int i) { m_size = i; }protected void setismissing(boolean flag) { m_ismissing = flag; }protected void setfieldname(string s) { m_fieldname = s; }protected void setfilename(string s) { m_filename = s; }protected void setfilepathname(string s) { m_filepathname = s; }protected void setfileext(string s) { m_fileext = s; }protected void setcontenttype(string s) { m_contenttype = s; }protected void setcontentdisp(string s) { m_contentdisp = s; }protected void settypemime(string s) { m_typemime = s; }protected void setsubtypemime(string s) { m_subtypemime = s; }public byte getbinarydata(int i) { if(m_startdata + i > m_enddata) throw new arrayindexoutofboundsexception("index out of range (1115)."); if(m_startdata + i <= m_enddata) return m_parent.m_binarray[m_startdata + i]; else return 0; } }files.javaimport java.io.ioexception; import java.util.*;// referenced classes of package com.jspsmart.upload: // file, smartuploadpublic class files {private smartupload m_parent; private hashtable m_files; private int m_counter;files() { m_files = new hashtable(); m_counter = 0; }protected void addfile(file file) { if(file == null) { throw new illegalargumentexception("newfile cannot be null."); } else { m_files.put(new integer(m_counter), file); m_counter++; return; } }public file getfile(int i) { if(i < 0) throw new illegalargumentexception("files index cannot be a negative value (1210)."); file file = (file)m_files.get(new integer(i)); if(file == null) throw new illegalargumentexception("files name is invalid or does not exist (1205)."); else return file; }public int getcount() { return m_counter; }public long getsize() throws ioexception { long l = 0l; for(int i = 0; i < m_counter; i++) l += getfile(i).getsize();return l; }public collection getcollection() { return m_files.values(); }public enumeration getenumeration() { return m_files.elements(); } }request.javaimport java.util.enumeration; import java.util.hashtable;public class request {private hashtable m_parameters; private int m_counter;request() { m_parameters = new hashtable(); m_counter = 0; }protected void putparameter(string s, string s1) { if(s == null) throw new illegalargumentexception("the name of an element cannot be null."); if(m_parameters.containskey(s)) { hashtable hashtable = (hashtable)m_parameters.get(s); hashtable.put(new integer(hashtable.size()), s1); } else { hashtable hashtable1 = new hashtable(); hashtable1.put(new integer(0), s1); m_parameters.put(s, hashtable1); m_counter++; } }public string getparameter(string s) { if(s == null) throw new illegalargumentexception("forms name is invalid or does not exist (1305)."); hashtable hashtable = (hashtable)m_parameters.get(s); if(hashtable == null) return null; else return (string)hashtable.get(new integer(0)); }public enumeration getparameternames() { return m_parameters.keys(); }public string[] getparametervalues(string s) { if(s == null) throw new illegalargumentexception("forms name is invalid or does not exist (1305)."); hashtable hashtable = (hashtable)m_parameters.get(s); if(hashtable == null) return null; string as[] = new string[hashtable.size()]; for(int i = 0; i < hashtable.size(); i++) as = (string)hashtable.get(new integer(i));return as; } }smartuploadexception .javapublic class smartuploadexception extends exception {smartuploadexception(string s) { super(s); } }smartupload.javaimport java.io.*; import java.sql.resultset; import java.sql.sqlexception; import java.util.vector; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.jspwriter; import javax.servlet.jsp.pagecontext;// referenced classes of package com.jspsmart.upload: // files, request, smartuploadexception, filepublic class smartupload {protected byte m_binarray[]; protected httpservletrequest m_request; protected httpservletresponse m_response; protected servletcontext m_application; private int m_totalbytes; private int m_currentindex; private int m_startdata; private int m_enddata; private string m_boundary; private long m_totalmaxfilesize; private long m_maxfilesize; private vector m_deniedfileslist; private vector m_allowedfileslist; private boolean m_denyphysicalpath; private boolean m_forcephysicalpath; private string m_contentdisposition; public static final int save_auto = 0; public static final int save_virtual = 1; public static final int save_physical = 2; private files m_files; private request m_formrequest;public smartupload() { m_totalbytes = 0; m_currentindex = 0; m_startdata = 0; m_enddata = 0; m_boundary = new string(); m_totalmaxfilesize = 0l; m_maxfilesize = 0l; m_deniedfileslist = new vector(); m_allowedfileslist = new vector(); m_denyphysicalpath = false; m_forcephysicalpath = false; m_contentdisposition = new string(); m_files = new files(); m_formrequest = new request(); }public final void init(servletconfig servletconfig) throws servletexception { m_application = servletconfig.getservletcontext(); }public void service(httpservletrequest httpservletrequest, httpservletresponse httpservletresponse) throws servletexception, ioexception { m_request = httpservletrequest; m_response = httpservletresponse; }public final void initialize(servletconfig servletconfig, httpservletrequest httpservletrequest, httpservletresponse httpservletresponse) throws servletexception { m_application = servletconfig.getservletcontext(); m_request = httpservletrequest; m_response = httpservletresponse; }public final void initialize(pagecontext pagecontext) throws servletexception { m_application = pagecontext.getservletcontext(); m_request = (httpservletrequest)pagecontext.getrequest(); m_response = (httpservletresponse)pagecontext.getresponse(); }public final void initialize(servletcontext servletcontext, httpsession httpsession, httpservletrequest httpservletrequest, httpservletresponse httpservletresponse, jspwriter jspwriter) throws servletexception { m_application = servletcontext; m_request = httpservletrequest; m_response = httpservletresponse; }public void upload() throws servletexception, ioexception, smartuploadexception { int i = 0; boolean flag = false; long l = 0l; boolean flag1 = false; string s = new string(); string s2 = new string(); string s4 = new string(); string s5 = new string(); string s6 = new string(); string s7 = new string(); string s8 = new string(); string s9 = new string(); string s10 = new string(); boolean flag2 = false; m_totalbytes = m_request.getcontentlength(); m_binarray = new byte[m_totalbytes]; int j; for(; i < m_totalbytes; i += j) try { m_request.getinputstream(); j = m_request.getinputstream().read(m_binarray, i, m_totalbytes - i); } catch(exception exception) { throw new smartuploadexception("unable to upload."); }for(; !flag1 ;; m_currentindex < m_totalbytes; m_currentindex++) if(m_binarray[m_currentindex] == 13) flag1 = true; else m_boundary = m_boundary + (char)m_binarray[m_currentindex];if(m_currentindex == 1) return; for(m_currentindex++; m_currentindex < m_totalbytes; m_currentindex = m_currentindex + 2) { string s1 = getdataheader(); m_currentindex = m_currentindex + 2; boolean flag3 = s1.indexof("filename") > 0; string s3 = getdatafieldvalue(s1, "name"); if(flag3) { s6 = getdatafieldvalue(s1, "filename"); s4 = getfilename(s6); s5 = getfileext(s4); s7 = getcontenttype(s1); s8 = getcontentdisp(s1); s9 = gettypemime(s7); s10 = getsubtypemime(s7); } getdatasection(); if(flag3 ;; s4.length() > 0) { if(m_deniedfileslist.contains(s5)) throw new securityexception("the extension of the file is denied to be uploaded (1015)."); if(!m_allowedfileslist.isempty() ;; !m_allowedfileslist.contains(s5)) throw new securityexception("the extension of the file is not allowed to be uploaded (1010)."); if(m_maxfilesize > 0l ;; (long)((m_enddata - m_startdata) + 1) > m_maxfilesize) throw new securityexception("size exceeded for this file : " + s4 + " (1105)."); l += (m_enddata - m_startdata) + 1; if(m_totalmaxfilesize > 0l ;; l > m_totalmaxfilesize) throw new securityexception("total file size exceeded (1110)."); } if(flag3) { com.facet.jspsmart.upload.file file = new com.facet.jspsmart.upload.file(); file.setparent(this); file.setfieldname(s3); file.setfilename(s4); file.setfileext(s5); file.setfilepathname(s6); file.setismissing(s6.length() == 0); file.setcontenttype(s7); file.setcontentdisp(s8); file.settypemime(s9); file.setsubtypemime(s10); if(s7.indexof("application/x-macbinary") > 0) m_startdata = m_startdata + 128; file.setsize((m_enddata - m_startdata) + 1); file.setstartdata(m_startdata); file.setenddata(m_enddata); m_files.addfile(file); } else { string s11 = new string(m_binarray, m_startdata, (m_enddata - m_startdata) + 1); m_formrequest.putparameter(s3, s11); } if((char)m_binarray[m_currentindex + 1] == -) break; }}public int save(string s) throws servletexception, ioexception, smartuploadexception { return save(s, 0); }public int save(string s, int i) throws servletexception, ioexception, smartuploadexception { int j = 0; if(s == null) s = m_application.getrealpath("/"); if(s.indexof("/") != -1) { if(s.charat(s.length() - 1) != /) s = s + "/"; } else if(s.charat(s.length() - 1) != \\) s = s + "\\"; for(int k = 0; k < m_files.getcount(); k++) if(!m_files.getfile(k).ismissing()) { m_files.getfile(k).saveas(s + m_files.getfile(k).getfilename(), i); j++; }return j; }public int getsize() { return m_totalbytes; }public byte getbinarydata(int i) { byte byte0; try { byte0 = m_binarray; } catch(exception exception) { throw new arrayindexoutofboundsexception("index out of range (1005)."); } return byte0; }public files getfiles() { return m_files; }public request getrequest() { return m_formrequest; }public void downloadfile(string s) throws servletexception, ioexception, smartuploadexception { downloadfile(s, null, null); }public void downloadfile(string s, string s1) throws servletexception, ioexception, smartuploadexception, smartuploadexception { downloadfile(s, s1, null); }public void downloadfile(string s, string s1, string s2) throws servletexception, ioexception, smartuploadexception { downloadfile(s, s1, s2, 65000); }public void downloadfile(string s, string s1, string s2, int i) throws servletexception, ioexception, smartuploadexception { if(s == null) throw new illegalargumentexception("file " + s + " not found (1040)."); if(s.equals("")) throw new illegalargumentexception("file " + s + " not found (1040)."); if(!isvirtual(s) ;; m_denyphysicalpath) throw new securityexception("physical path is denied (1035)."); if(isvirtual(s)) s = m_application.getrealpath(s); java.io.file file = new java.io.file(s); fileinputstream fileinputstream = new fileinputstream(file); long l = file.length(); boolean flag = false; int k = 0; byte abyte0[] = new byte; if(s1 == null) m_response.setcontenttype("application/x-msdownload"); else if(s1.length() == 0) m_response.setcontenttype("application/x-msdownload"); else m_response.setcontenttype(s1); m_response.setcontentlength((int)l); m_contentdisposition = m_contentdisposition != null ? m_contentdisposition : "p_w_upload;"; if(s2 == null) m_response.setheader("content-disposition", m_contentdisposition + " filename=" + getfilename(s)); else if(s2.length() == 0) m_response.setheader("content-disposition", m_contentdisposition); else m_response.setheader("content-disposition", m_contentdisposition + " filename=" + s2); while((long)k < l) { int j = fileinputstream.read(abyte0, 0, i); k += j; m_response.getoutputstream().write(abyte0, 0, j); } fileinputstream.close(); }public void downloadfield(resultset resultset, string s, string s1, string s2) throws servletexception, ioexception, sqlexception { if(resultset == null) throw new illegalargumentexception("the recordset cannot be null (1045)."); if(s == null) throw new illegalargumentexception("the columnname cannot be null (1050)."); if(s.length() == 0) throw new illegalargumentexception("the columnname cannot be empty (1055)."); byte abyte0[] = resultset.getbytes(s); if(s1 == null) m_response.setcontenttype("application/x-msdownload"); else if(s1.length() == 0) m_response.setcontenttype("application/x-msdownload"); else m_response.setcontenttype(s1); m_response.setcontentlength(abyte0.length); if(s2 == null) m_response.setheader("content-disposition", "p_w_upload;"); else if(s2.length() == 0) m_response.setheader("content-disposition", "p_w_upload;"); else m_response.setheader("content-disposition", "p_w_upload; filename=" + s2); m_response.getoutputstream().write(abyte0, 0, abyte0.length); }public void fieldtofile(resultset resultset, string s, string s1) throws servletexception, ioexception, smartuploadexception, sqlexception { try { if(m_application.getrealpath(s1) != null) s1 = m_application.getrealpath(s1); inputstream inputstream = resultset.getbinarystream(s); fileoutputstream fileoutputstream = new fileoutputstream(s1); int i; while((i = inputstream.read()) != -1) fileoutputstream.write(i); fileoutputstream.close(); } catch(exception exception) { throw new smartuploadexception("unable to save file from the database (1020)."); } }private string getdatafieldvalue(string s, string s1) { string s2 = new string(); string s3 = new string(); int i = 0; boolean flag = false; boolean flag1 = false; boolean flag2 = false; s2 = s1 + "=" + "; i = s.indexof(s2); if(i > 0) { int j = i + s2.length(); int k = j; s2 = "\""; int l = s.indexof(s2, j); if(k > 0 ;; l > 0) s3 = s.substring(k, l); } return s3; }private string getfileext(string s) { string s1 = new string(); int i = 0; int j = 0; if(s == null) return null; i = s.lastindexof(46) + 1; j = s.length(); s1 = s.substring(i, j); if(s.lastindexof(46) > 0) return s1; else return ""; }private string getcontenttype(string s) { string s1 = new string(); string s2 = new string(); int i = 0; boolean flag = false; s1 = "content-type:"; i = s.indexof(s1) + s1.length(); if(i != -1) { int j = s.length(); s2 = s.substring(i, j); } return s2; }private string gettypemime(string s) { string s1 = new string(); int i = 0; i = s.indexof("/"); if(i != -1) return s.substring(1, i); else return s; }private string getsubtypemime(string s) { string s1 = new string(); int i = 0; boolean flag = false; i = s.indexof("/") + 1; if(i != -1) { int j = s.length(); return s.substring(i, j); } else { return s; } }private string getcontentdisp(string s) { string s1 = new string(); int i = 0; int j = 0; i = s.indexof(":") + 1; j = s.indexof(";"); s1 = s.substring(i, j); return s1; }private void getdatasection() { boolean flag = false; string s = new string(); int i = m_currentindex; int j = 0; int k = m_boundary.length(); m_startdata = m_currentindex; m_enddata = 0; while(i < m_totalbytes) if(m_binarray == (byte)m_boundary.charat(j)) { if(j == k - 1) { m_enddata = ((i - k) + 1) - 3; break; } i++; j++; } else { i++; j = 0; } m_currentindex = m_enddata + k + 3; }private string getdataheader() { int i = m_currentindex; int j = 0; boolean flag = false; for(boolean flag1 = false; !flag1;) if(m_binarray[m_currentindex] == 13 ;; m_binarray[m_currentindex + 2] == 13) { flag1 = true; j = m_currentindex - 1; m_currentindex = m_currentindex + 2; } else { m_currentindex++; }string s = new string(m_binarray, i, (j - i) + 1); return s; }private string getfilename(string s) { string s1 = new string(); string s2 = new string(); int i = 0; boolean flag = false; boolean flag1 = false; boolean flag2 = false; i = s.lastindexof(47); if(i != -1) return s.substring(i + 1, s.length()); i = s.lastindexof(92); if(i != -1) return s.substring(i + 1, s.length()); else return s; }public void setdeniedfileslist(string s) throws servletexception, ioexception, sqlexception { string s1 = ""; if(s != null) { string s2 = ""; for(int i = 0; i < s.length(); i++) if(s.charat(i) == ,) { if(!m_deniedfileslist.contains(s2)) m_deniedfileslist.addelement(s2); s2 = ""; } else { s2 = s2 + s.charat(i); }if(s2 != "") m_deniedfileslist.addelement(s2); } else { m_deniedfileslist = null; } }public void setallowedfileslist(string s) { string s1 = ""; if(s != null) { string s2 = ""; for(int i = 0; i < s.length(); i++) if(s.charat(i) == ,) { if(!m_allowedfileslist.contains(s2)) m_allowedfileslist.addelement(s2); s2 = ""; } else { s2 = s2 + s.charat(i); }if(s2 != "") m_allowedfileslist.addelement(s2); } else { m_allowedfileslist = null; } }public void setdenyphysicalpath(boolean flag) { m_denyphysicalpath = flag; }public void setforcephysicalpath(boolean flag) { m_forcephysicalpath = flag; }public void setcontentdisposition(string s) { m_contentdisposition = s; }public void settotalmaxfilesize(long l) { m_totalmaxfilesize = l; }public void setmaxfilesize(long l) { m_maxfilesize = l; }protected string getphysicalpath(string s, int i) throws ioexception { string s1 = new string(); string s2 = new string(); string s3 = new string(); boolean flag = false; s3 = system.getproperty("file.separator"); if(s == null) throw new illegalargumentexception("there is no specified destination file (1140)."); if(s.equals("")) throw new illegalargumentexception("there is no specified destination file (1140)."); if(s.lastindexof("\\") >= 0) { s1 = s.substring(0, s.lastindexof("\\")); s2 = s.substring(s.lastindexof("\\") + 1); } if(s.lastindexof("/") >= 0) { s1 = s.substring(0, s.lastindexof("/")); s2 = s.substring(s.lastindexof("/") + 1); } s1 = s1.length() != 0 ? s1 : "/"; java.io.file file = new java.io.file(s1); if(file.exists()) flag = true; if(i == 0) { if(isvirtual(s1)) { s1 = m_application.getrealpath(s1); if(s1.endswith(s3)) s1 = s1 + s2; else s1 = s1 + s3 + s2; return s1; } if(flag) { if(m_denyphysicalpath) throw new illegalargumentexception("physical path is denied (1125)."); else return s; } else { throw new illegalargumentexception("this path does not exist (1135)."); } } if(i == 1) { if(isvirtual(s1)) { s1 = m_application.getrealpath(s1); if(s1.endswith(s3)) s1 = s1 + s2; else s1 = s1 + s3 + s2; return s1; } if(flag) throw new illegalargumentexception("the path is not a virtual path."); else throw new illegalargumentexception("this path does not exist (1135)."); } if(i == 2) { if(flag) if(m_denyphysicalpath) throw new illegalargumentexception("physical path is denied (1125)."); else return s; if(isvirtual(s1)) throw new illegalargumentexception("the path is not a physical path."); else throw new illegalargumentexception("this path does not exist (1135)."); } else { return null; } }public void uploadinfile(string s) throws ioexception, smartuploadexception { int i = 0; int j = 0; boolean flag = false; if(s == null) throw new illegalargumentexception("there is no specified destination file (1025)."); if(s.length() == 0) throw new illegalargumentexception("there is no specified destination file (1025)."); if(!isvirtual(s) ;; m_denyphysicalpath) throw new securityexception("physical path is denied (1035)."); i = m_request.getcontentlength(); m_binarray = new byte; int k; for(; j < i; j += k) try { k = m_request.getinputstream().read(m_binarray, j, i - j); } catch(exception exception) { throw new smartuploadexception("unable to upload."); }if(isvirtual(s)) s = m_application.getrealpath(s); try { java.io.file file = new java.io.file(s); fileoutputstream fileoutputstream = new fileoutputstream(file); fileoutputstream.write(m_binarray); fileoutputstream.close(); } catch(exception exception1) { throw new smartuploadexception("the form cannot be saved in the specified file (1030)."); } }private boolean isvirtual(string s) { if(m_application.getrealpath(s) != null) { java.io.file file = new java.io.file(m_application.getrealpath(s)); return file.exists(); } else { return false; } } }jspsmart的使用上传// 新建一个smartupload对象 smartupload su = new smartupload(); // 上传初始化 su.initialize(pagecontext); // 限制每个上传文件的最大长度。 su.setmaxfilesize(10000); // 限制总上传数据的长度。 su.settotalmaxfilesize(20000); // 设定允许上传的文件(通过扩展名限制),仅允许doc,txt文件。 su.setallowedfileslist("doc,txt"); // 设定禁止上传的文件(通过扩展名限制),禁止上传带有exe,bat, //jsp,htm,html扩展名的文件和没有扩展名的文件。 su.setdeniedfileslist("exe,bat,jsp,htm,html,,"); // 上传文件 su.upload(); // 将上传文件全部保存到指定目录 int count = su.save("/upload");下载// 新建一个smartupload对象 smartupload su = new smartupload(); // 初始化 su.initialize(pagecontext); // 设定contentdisposition为null以禁止浏览器自动打开文件, //确保点击链接后是下载文件。若不设定,则下载的文件扩展名为 //doc时,浏览器将自动用word打开他。扩展名为pdf时, //浏览器将用acrobat打开。 su.setcontentdisposition(null); // 下载文件 su.downloadfile("/upload/test.doc"); 更多黑客技术 黑客软件 计算机技术 编程技术 网站技术 qq技术 IT新闻 黑客基地 请访问 灯火安全联盟 灯火黑客 www.hack8888.com/bbs
| |  | |  |
|