package com.he;
成都創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)提供從項(xiàng)目策劃、軟件開(kāi)發(fā),軟件安全維護(hù)、網(wǎng)站優(yōu)化(SEO)、網(wǎng)站分析、效果評(píng)估等整套的建站服務(wù),主營(yíng)業(yè)務(wù)為做網(wǎng)站、成都網(wǎng)站建設(shè),成都app軟件開(kāi)發(fā)公司以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。成都創(chuàng)新互聯(lián)公司深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.*;
public class CodeFact
extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
//設(shè)置頁(yè)面不緩存
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
// 在內(nèi)存中創(chuàng)建圖象
int width = 60, height = 20;
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// 獲取圖形上下文
Graphics g = image.getGraphics();
//生成隨機(jī)類(lèi)
Random random = new Random();
// 設(shè)定背景色
g.setColor(getRandColor(200, 250));
g.fillRect(0, 0, width, height);
//設(shè)定字體
g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
//畫(huà)邊框
g.setColor(new Color(33,66,99));
g.drawRect(0,0,width-1,height-1);
// 隨機(jī)產(chǎn)生155條干擾線,使圖象中的認(rèn)證碼不易被其它程序探測(cè)到
g.setColor(getRandColor(160, 200));
for (int i = 0; i 155; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x, y, x + xl, y + yl);
}
// 取隨機(jī)產(chǎn)生的認(rèn)證碼(4位數(shù)字)
String sRand = "";
for (int i = 0; i 4; i++) {
String rand = String.valueOf(random.nextInt(10));
sRand += rand;
// 將認(rèn)證碼顯示到圖象中
g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110),
20 + random.nextInt(110))); //調(diào)用函數(shù)出來(lái)的顏色相同,可能是因?yàn)榉N子太接近,所以只能直接生成
g.drawString(rand, 13 * i + 6, 16);
}
// 將認(rèn)證碼存入SESSION
HttpSession session = request.getSession();
session.setAttribute("rand", sRand);
// 圖象生效
g.dispose();
// 輸出圖象到頁(yè)面
ImageIO.write(image, "JPEG", response.getOutputStream());
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
doGet(request, response);
}
//給定范圍獲得隨機(jī)顏色
private Color getRandColor(int fc, int bc) {
Random random = new Random();
if (fc 255) {
fc = 255;
}
if (bc 255) {
bc = 255;
}
int r = fc + random.nextInt(bc - fc);
int g = fc + random.nextInt(bc - fc);
int b = fc + random.nextInt(bc - fc);
return new Color(r, g, b);
}
}
你試試??!
package?util;
import?java.awt.Color;
import?java.awt.Font;
import?java.awt.Graphics;
import?java.awt.image.BufferedImage;
import?java.io.FileOutputStream;
import?java.io.IOException;
import?java.io.OutputStream;
import?java.util.Random;
import?javax.imageio.ImageIO;
public?final?class?ImageUtil?{
//?驗(yàn)證碼字符集
private?static?final?char[]?chars?=?{?
'0',?'1',?'2',?'3',?'4',?'5',?'6',?'7',?'8',?'9',?
'A',?'B',?'C',?'D',?'E',?'F',?'G',?'H',?'I',?'J',?'K',?'L',?'M',?'N',?
'O',?'P',?'Q',?'R',?'S',?'T',?'U',?'V',?'W',?'X',?'Y',?'Z',?
'a',?'b',?'c',?'d',?'e',?'f',?'g',?'h',?'i',?'j',?'k',?'l',?'m',?'n',?
'o',?'p',?'q',?'r',?'s',?'t',?'u',?'v',?'w',?'x',?'y',?'z'};
//?字符數(shù)量
private?static?final?int?SIZE?=?4;
//?干擾線數(shù)量
private?static?final?int?LINES?=?5;
//?寬度
private?static?final?int?WIDTH?=?80;
//?高度
private?static?final?int?HEIGHT?=?40;
//?字體大小
private?static?final?int?FONT_SIZE?=?30;
/**
*?生成隨機(jī)驗(yàn)證碼及圖片
*?返回的數(shù)組中,第1個(gè)值是驗(yàn)證碼,第2個(gè)值是圖片
*/
public?static?Object[]?createImage()?{
StringBuffer?sb?=?new?StringBuffer();
//?1.創(chuàng)建空白圖片
BufferedImage?image?=?new?BufferedImage(
WIDTH,?HEIGHT,?BufferedImage.TYPE_INT_RGB);
//?2.獲取圖片畫(huà)筆
Graphics?graphic?=?image.getGraphics();
//?3.設(shè)置畫(huà)筆顏色
graphic.setColor(Color.LIGHT_GRAY);
//?4.繪制矩形背景
graphic.fillRect(0,?0,?WIDTH,?HEIGHT);
//?5.畫(huà)隨機(jī)字符
Random?ran?=?new?Random();
for?(int?i?=?0;?i?SIZE;?i++)?{
//?取隨機(jī)字符索引
int?n?=?ran.nextInt(chars.length);
//?設(shè)置隨機(jī)顏色
graphic.setColor(getRandomColor());
//?設(shè)置字體大小
graphic.setFont(new?Font(
null,?Font.BOLD?+?Font.ITALIC,?FONT_SIZE));
//?畫(huà)字符
graphic.drawString(
chars[n]?+?"",?i?*?WIDTH?/?SIZE,?HEIGHT?/?2);
//?記錄字符
sb.append(chars[n]);
}
//?6.畫(huà)干擾線
for?(int?i?=?0;?i??LINES;?i++)?{
//?設(shè)置隨機(jī)顏色
graphic.setColor(getRandomColor());
//?隨機(jī)畫(huà)線
graphic.drawLine(ran.nextInt(WIDTH),?ran.nextInt(HEIGHT),
ran.nextInt(WIDTH),?ran.nextInt(HEIGHT));
}
//?7.返回驗(yàn)證碼和圖片
return?new?Object[]{sb.toString(),?image};
}
/**
*?隨機(jī)取色
*/
public?static?Color?getRandomColor()?{
Random?ran?=?new?Random();
Color?color?=?new?Color(ran.nextInt(256),?
ran.nextInt(256),?ran.nextInt(256));
return?color;
}
public?static?void?main(String[]?args)?throws?IOException?{
Object[]?objs?=?createImage();
BufferedImage?image?=?(BufferedImage)?objs[1];
OutputStream?os?=?new?FileOutputStream("d:/1.png");
ImageIO.write(image,?"jpeg",?os);
os.close();
}
}
生成code.jsp文件的完整代碼如下:
%@ page language="java" contentType="image/jpeg; charset=gb2312"
pageEncoding="gb2312"%
%@ page import="java.awt.*,java.awt.image.*" %
%@ page import="java.util.*,javax.imageio.*" %
%!
Color getRandColor(int fc,int bc){
Random r=new Random();
if(fc255) fc=255;
if(bc200) bc=255;
int red=fc+r.nextInt(bc-fc);
int green=fc+r.nextInt(bc-fc);
int blue=fc+r.nextInt(bc-fc);
return new Color(red,green,blue);
}%
% //設(shè)置頁(yè)面不緩存
response.setHeader("Pragma","No-cache");
response.setHeader("cache-Control","no-cache");
response.setDateHeader("Expires",0);
//創(chuàng)建隨機(jī)類(lèi)
Random r=new Random();
//在內(nèi)存中創(chuàng)建圖像,寬度,高度
int width=80,height=30;
BufferedImage pic=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//獲取圖形上下文環(huán)境
Graphics gc=pic.getGraphics();
//設(shè)定背景顏色并進(jìn)行填充
gc.setColor(getRandColor(200,250));
gc.fillRect(0,0,width,height);
//設(shè)定圖形上下文環(huán)境字體
gc.setFont(new Font("Times New Roman",Font.PLAIN,20));
//畫(huà)邊框
//gc.setColor(new Color(1));
//gc.drawRect(0,0,width-1,height-1);
//隨機(jī)產(chǎn)生200條干擾直線,使圖像中的認(rèn)證碼不易被其他分析程序探測(cè)
gc.setColor(getRandColor(160,200));
for(int i=0;i200;i++)
{
int x1=r.nextInt(width);
int y1=r.nextInt(height);
int x2=r.nextInt(15);
int y2=r.nextInt(15);
gc.drawLine(x1,y1,x1+x2,y1+y2);
}
//隨即產(chǎn)生100個(gè)干擾點(diǎn)
gc.setColor(getRandColor(120,240));
for(int i=1;i100;i++){
int x=r.nextInt(width);
int y=r.nextInt(height);
gc.drawOval(x,y,0,0);
}
//隨機(jī)產(chǎn)生四位數(shù)字的驗(yàn)證碼
String RS="";
String rn="";
for(int i=0;i4;i++)
{
//產(chǎn)生十以內(nèi)隨機(jī)數(shù)字
rn=String.valueOf(r.nextInt(10));
RS+=rn;
//將認(rèn)證碼用drawString函數(shù)顯示到圖像里
gc.setColor(new Color(20+r.nextInt(110),20+r.nextInt(110),20+r.nextInt(110)));//使字體顏色效果明顯
gc.drawString(rn,13*i+16,16);
}
//釋放圖形上下文環(huán)境
gc.dispose();
//將認(rèn)證碼RS存入session中共享
session.setAttribute("random",RS);
//輸出生成后的圖象到頁(yè)面
ImageIO.write(pic,"JPEG",response.getOutputStream());
out.clear();
out = pageContext.pushBody();
%
使用隨即碼的jsp文件中加入下面一句即可
image src="code.jsp"
package com.bbs.servlet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
public class Image extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("image/jpeg");
OutputStream out = response.getOutputStream();
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
int width = 60, height = 20;
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// 獲取圖形上下文
Graphics g = image.getGraphics();
// 生成隨機(jī)類(lèi)
Random random = new Random();
// 設(shè)定背景色
g.setColor(getRandColor(200, 250));
g.fillRect(0, 0, width, height);
// 設(shè)定字體
g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
// 隨機(jī)產(chǎn)生155條干擾線,使圖象中的認(rèn)證碼不易被其它程序探測(cè)到
g.setColor(getRandColor(180, 200));
for (int i = 0; i 155; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x, y, x + xl, y + yl);
}
// 取隨機(jī)產(chǎn)生的認(rèn)證碼(4位數(shù)字)
String sRand =setRandValue(request);
if(sRand!=null)
for (int i = 0; i sRand.length(); i++) {
g.setColor(new Color(20 + random.nextInt(200), 20 + random
.nextInt(200), 20 + random.nextInt(200)));
// 調(diào)用函數(shù)出來(lái)的顏色相同,可能是因?yàn)榉N子太接近,所以只能直接生成
g.drawString(sRand.charAt(i) + "", 13 * i + 6, 16);
}
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
// 圖象生效
g.dispose();
// 輸出圖象到頁(yè)面
// ImageIO.write(image, "JPG", response.getOutputStream());
out.flush();
out.close();
}
Color getRandColor(int fc, int bc) {// 給定范圍獲得隨機(jī)顏色
Random random = new Random();
if (fc 255)
fc = 255;
if (bc 255)
bc = 255;
int r = fc + random.nextInt(bc - fc);
int g = fc + random.nextInt(bc - fc);
int b = fc + random.nextInt(bc - fc);
return new Color(r, g, b);
}
//48-57對(duì)應(yīng)0-9;65-90對(duì)應(yīng)A-Z;97-122對(duì)應(yīng)a-z;
String setRandValue(HttpServletRequest request) {
Random random = new Random();
String sRand = "";
//這里是生成驗(yàn)證碼的位數(shù)
for (int i = 0; i 4; i++) {
char c = 0;
int k = random.nextInt(3);
switch (k) {
case 0:
c = (char) (random.nextInt(10) + 48);
break;
case 1:
c = (char) (random.nextInt(26) + 65);
break;
case 2:
c = (char) (random.nextInt(26) + 97);
}
sRand += c;
}
request.getSession().setAttribute("rands", sRand);
return sRand;
}
}
Java如何實(shí)現(xiàn)驗(yàn)證碼驗(yàn)證功能呢?日常生活中,驗(yàn)證碼隨處可見(jiàn),他可以在一定程度上保護(hù)賬號(hào)安全,那么他是怎么實(shí)現(xiàn)的呢?
Java實(shí)現(xiàn)驗(yàn)證碼驗(yàn)證功能其實(shí)非常簡(jiǎn)單:用到了一個(gè)Graphics類(lèi)在畫(huà)板上繪制字母,隨機(jī)選取一定數(shù)量的字母隨機(jī)生成,然后在畫(huà)板上隨機(jī)生成幾條干擾線。
首先,寫(xiě)一個(gè)驗(yàn)證碼生成幫助類(lèi),用來(lái)繪制隨機(jī)字母:
import?java.awt.Color;
import?java.awt.Font;
import?java.awt.Graphics;
import?java.awt.image.BufferedImage;
import?java.io.IOException;
import?java.io.OutputStream;
import?java.util.Random;
import?javax.imageio.ImageIO;
public?final?class?GraphicHelper?{
/**
*?以字符串形式返回生成的驗(yàn)證碼,同時(shí)輸出一個(gè)圖片
*
*?@param?width
*????????????圖片的寬度
*?@param?height
*????????????圖片的高度
*?@param?imgType
*????????????圖片的類(lèi)型
*?@param?output
*????????????圖片的輸出流(圖片將輸出到這個(gè)流中)
*?@return?返回所生成的驗(yàn)證碼(字符串)
*/
public?static?String?create(final?int?width,?final?int?height,?final?String?imgType,?OutputStream?output)?{
StringBuffer?sb?=?new?StringBuffer();
Random?random?=?new?Random();
BufferedImage?image?=?new?BufferedImage(width,?height,?BufferedImage.TYPE_INT_RGB);
Graphics?graphic?=?image.getGraphics();
graphic.setColor(Color.getColor("F8F8F8"));
graphic.fillRect(0,?0,?width,?height);
Color[]?colors?=?new?Color[]?{?Color.BLUE,?Color.GRAY,?Color.GREEN,?Color.RED,?Color.BLACK,?Color.ORANGE,
Color.CYAN?};
//?在?"畫(huà)板"上生成干擾線條?(?50?是線條個(gè)數(shù))
for?(int?i?=?0;?i??50;?i++)?{
graphic.setColor(colors[random.nextInt(colors.length)]);
final?int?x?=?random.nextInt(width);
final?int?y?=?random.nextInt(height);
final?int?w?=?random.nextInt(20);
final?int?h?=?random.nextInt(20);
final?int?signA?=?random.nextBoolean()???1?:?-1;
final?int?signB?=?random.nextBoolean()???1?:?-1;
graphic.drawLine(x,?y,?x?+?w?*?signA,?y?+?h?*?signB);
}
//?在?"畫(huà)板"上繪制字母
graphic.setFont(new?Font("Comic?Sans?MS",?Font.BOLD,?30));
for?(int?i?=?0;?i??6;?i++)?{
final?int?temp?=?random.nextInt(26)?+?97;
String?s?=?String.valueOf((char)?temp);
sb.append(s);
graphic.setColor(colors[random.nextInt(colors.length)]);
graphic.drawString(s,?i?*?(width?/?6),?height?-?(height?/?3));
}
graphic.dispose();
try?{
ImageIO.write(image,?imgType,?output);
}?catch?(IOException?e)?{
e.printStackTrace();
}
return?sb.toString();
}
}?
接著,創(chuàng)建一個(gè)servlet,用來(lái)固定圖片大小,以及處理驗(yàn)證碼的使用場(chǎng)景,以及捕獲頁(yè)面生成的驗(yàn)證碼(捕獲到的二維碼與用戶輸入的驗(yàn)證碼一致才能通過(guò))。
import?java.io.OutputStream;
import?javax.servlet.ServletException;
import?javax.servlet.annotation.WebServlet;
import?javax.servlet.http.HttpServlet;
import?javax.servlet.http.HttpServletRequest;
import?javax.servlet.http.HttpServletResponse;
import?javax.servlet.http.HttpSession;
@WebServlet(urlPatterns?=?"/verify/regist.do"?)
public?class?VerifyCodeServlet?extends?HttpServlet?{
private?static?final?long?serialVersionUID?=?3398560501558431737L;
@Override
protected?void?service(HttpServletRequest?request,?HttpServletResponse?response)
throws?ServletException,?IOException?{
//?獲得?當(dāng)前請(qǐng)求?對(duì)應(yīng)的?會(huì)話對(duì)象
HttpSession?session?=?request.getSession();
//?從請(qǐng)求中獲得?URI?(?統(tǒng)一資源標(biāo)識(shí)符?)
String?uri?=?request.getRequestURI();
System.out.println("hello?:?"?+?uri);
final?int?width?=?180;?//?圖片寬度
final?int?height?=?40;?//?圖片高度
final?String?imgType?=?"jpeg";?//?指定圖片格式?(不是指MIME類(lèi)型)
final?OutputStream?output?=?response.getOutputStream();?//?獲得可以向客戶端返回圖片的輸出流
//?(字節(jié)流)
//?創(chuàng)建驗(yàn)證碼圖片并返回圖片上的字符串
String?code?=?GraphicHelper.create(width,?height,?imgType,?output);
System.out.println("驗(yàn)證碼內(nèi)容:?"?+?code);
//?建立?uri?和?相應(yīng)的?驗(yàn)證碼?的關(guān)聯(lián)?(?存儲(chǔ)到當(dāng)前會(huì)話對(duì)象的屬性中?)
session.setAttribute(uri,?code);
System.out.println(session.getAttribute(uri));
}
}?
接著寫(xiě)一個(gè)HTML注冊(cè)頁(yè)面用來(lái)檢驗(yàn)一下:
html
head
meta?charset="UTF-8"
title注冊(cè)/title
link?rel="stylesheet"?href="styles/general.css"
link?rel="stylesheet"?href="styles/cell.css"
link?rel="stylesheet"?href="styles/form.css"
script?type="text/javascript"?src="js/ref.js"/script
style?type="text/css"?
.logo-container?{
margin-top:?50px?;
}
.logo-container?img?{
width:?100px?;
}
.message-container?{
height:?80px?;
}
.link-container?{
height:?40px?;
line-height:?40px?;
}
.link-container?a?{
text-decoration:?none?;
}
/style
/head
body
div?class="container?form-container"
form?action="/wendao/regist.do"?method="post"
div?class="form"?!--?注冊(cè)表單開(kāi)始?--
div?class="form-row"
span?class="cell-1"
i?class="fa?fa-user"/i
/span
span?class="cell-11"?style="text-align:?left;"
input?type="text"?name="username"?placeholder="請(qǐng)輸入用戶名"
/span
/div
div?class="form-row"
span?class="cell-1"
i?class="fa?fa-key"/i
/span
span?class="cell-11"?style="text-align:?left;"
input?type="password"?name="password"?placeholder="請(qǐng)輸入密碼"
/span
/div
div?class="form-row"
span?class="cell-1"
i?class="fa?fa-keyboard-o"/i
/span
span?class="cell-11"?style="text-align:?left;"
input?type="password"?name="confirm"?placeholder="請(qǐng)確認(rèn)密碼"
/span
/div
div?class="form-row"
span?class="cell-7"
input?type="text"?name="verifyCode"?placeholder="請(qǐng)輸入驗(yàn)證碼"
/span
span?class="cell-5"?style="text-align:?center;"
img?src="/demo/verify/regist.do"?onclick="myRefersh(this)"
/span
/div
div?class="form-row"?style="border:?none;"
span?class="cell-6"?style="text-align:?left"
input?type="reset"?value="重置"
/span
span?class="cell-6"??style="text-align:right;"
input?type="submit"?value="注冊(cè)"
/span
/div
/div?!--?注冊(cè)表單結(jié)束?--
/form
/div
/body
/html
效果如下圖:
在控制臺(tái)接收到的圖片中驗(yàn)證碼的變化如下:
當(dāng)點(diǎn)擊刷新頁(yè)面的時(shí)候,驗(yàn)證碼也會(huì)隨著變化,但我們看不清驗(yàn)證碼時(shí),只要點(diǎn)擊驗(yàn)證碼就會(huì)刷新,這樣局部的刷新可以用JavaScript來(lái)實(shí)現(xiàn)。
在img
src="/demo/verify/regist.do"中,添加一個(gè)問(wèn)號(hào)和一串后綴數(shù)字,當(dāng)刷新時(shí)讓后綴數(shù)字不斷改變,那么形成的驗(yàn)證碼也會(huì)不斷變化,我們可以采用的一種辦法是后綴數(shù)字用date代替,date獲取本機(jī)時(shí)間,時(shí)間是隨時(shí)變的,這樣就保證了刷新驗(yàn)證碼可以隨時(shí)變化。
代碼如下:
function?myRefersh(?e?)?{
const?source?=?e.src?;?//?獲得原來(lái)的?src?中的內(nèi)容
//console.log(?"source?:?"?+?source??)?;
var?index?=?source.indexOf(?"?"?)?;??//?從?source?中尋找???第一次出現(xiàn)的位置?(如果不存在則返回?-1?)
//console.log(?"index?:?"?+?index??)?;
if(?index??-1?)?{?//?如果找到了????就進(jìn)入內(nèi)部
var?s?=?source.substring(?0?,?index?)?;?//?從?source?中截取?index?之前的內(nèi)容?(?index?以及?index?之后的內(nèi)容都被舍棄?)
//console.log(?"s?:?"?+?s??)?;
var?date?=?new?Date();?//?創(chuàng)建一個(gè)?Date?對(duì)象的?一個(gè)?實(shí)例
var?time?=?date.getTime()?;?//?從?新創(chuàng)建的?Date?對(duì)象的實(shí)例中獲得該時(shí)間對(duì)應(yīng)毫秒值
e.src?=?s?+?"?time="?+?time?;?//?將?加了?尾巴?的?地址?重新放入到?src?上
//console.log(?e.src?)?;
}?else?{
var?date?=?new?Date();
e.src?=?source?+?"?time="?+?date.getTime();
}
}
如回答不詳細(xì)可追問(wèn)
網(wǎng)站題目:java圖形驗(yàn)證碼代碼 圖形驗(yàn)證碼生成
轉(zhuǎn)載注明:http://muchs.cn/article46/hhejhg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、響應(yīng)式網(wǎng)站、微信小程序、品牌網(wǎng)站建設(shè)、建站公司、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容