Java-Web程序设计与案例教程-第3章-Cookie与Session.ppt

上传人(卖家):三亚风情 文档编号:3372358 上传时间:2022-08-24 格式:PPT 页数:50 大小:943KB
下载 相关 举报
Java-Web程序设计与案例教程-第3章-Cookie与Session.ppt_第1页
第1页 / 共50页
Java-Web程序设计与案例教程-第3章-Cookie与Session.ppt_第2页
第2页 / 共50页
Java-Web程序设计与案例教程-第3章-Cookie与Session.ppt_第3页
第3页 / 共50页
Java-Web程序设计与案例教程-第3章-Cookie与Session.ppt_第4页
第4页 / 共50页
Java-Web程序设计与案例教程-第3章-Cookie与Session.ppt_第5页
第5页 / 共50页
点击查看更多>>
资源描述

1、第3章 Cookie与Session 本章内容o 基于Servlet的简单Web应用o Cookie的含义和用法o Session的含义和用法o Session的工作原理o 个人信息模块的实现o 基于MVC的购物车3.1 使用Servlet编写简单Web应用o 使用Servlet开发一个模拟登录的Web应用o 主要功能n 登录n 个人信息的完善和查询3.1使用Servlet编写简单Web应用o3.1.1 Web应用功能说明o3.1.2 登录模块的实现3.1.1 Web应用功能说明图3.1 登录页面图3.2 个人信息首页用户可通过图3.1所示的登录页面填写用户名和密码进行登录操作,如果用户名和密

2、码都不为空,则判定该登录有效,显示如图3.2所示的个人信息应用首页,该首页不仅显示了当前用户的个人信息的页面链接,以及完善个人信息的页面链接,还显示了当前的登录用户名,以及登录时间信息3.1.1 Web应用功能说明当点击“查看个人信息”链接时,系统应显示当前登录用户完善后的个人信息。如果该用户从来没有点击“完善个人信息”链接,则需要对信息进行完善,此时系统会直接跳转至“完善个人信息”页面,如图3.3和图3.4所示。图3.3 完善个人信息1图3.4 完善个人信息23.1.1 Web应用功能说明如果当前用户已经完善过个人信息,则直接显示完善后的用户信息,如图3.5所示。图3.5 查看个人信息详情3

3、.1.2 登录模块的实现o 工程结构如图3.6图3.6 LoginDemo工程结构1.“cn.edu.zzti.entity”包中包含User和PersonalInfo两个实体类,分别用来存储用户的登录信息和当前登录用户的具体个人信息2.“cn.edu.zzti.servlet.view”包中存放展现给用户的5个页面,包括登录页面、Web应用首页、个人信息完善表单1、个人信息完善表单2、个人信息详情页面。3.“cn.edu.zzti.servlet”包中包含两个Servlet,“LoginServlet”的主要功能是对来自登录页面中的表单参数进行校验和存储,“PersonalInfoProce

4、ss”的主要功能是接收来自个人信息完善表单中的数据,对完善后的个人信息进行封装和存储。3.1.2 登录模块的实现o 本章的登录页面根据用户提交的参数正确与否来产生不同的响应,如果用户名密码都不为空,则跳转到图3.2;否则,跳转到,如图3.7所示的登录页面,并提示错误信息。图3.7 登录异常响应结果页面登录模块示例源码:loginDemo(ch3-1)3.1.2 登录模块的实现o“cn.edu.zzti.entity.User”用户实体类3.1.2 登录模块的实现o“cn.edu.zzti.entity.PersonalInfo”代码3.1.2 登录模块的实现o“cn.edu.zzti.serv

5、let.view.LoginPageView”代码如下:1 WebServlet(/servlet/LoginPageView)2 public class LoginPageView extends HttpServlet 3 public void doGet(HttpServletRequest request,HttpServletResponse response)4 throws ServletException,IOException 5 request.setCharacterEncoding(utf-8);6 response.setContentType(text/html

6、;charset=utf-8);7 PrintWriter out=response.getWriter();8 out.println();9 out.println();10 out.println(登录页面);11 out.println();12 Object error=request.getAttribute(error);13if(error!=null)14 out.println(请重新登录:请重新登录:+error+);1516 String body=+17 username:+18 password:+19 ;20 out.println(body);21 out.pr

7、intln();22 out.println();23 out.flush();24 out.close();25 26 public void doPost(HttpServletRequest request,HttpServletResponse response)27 throws ServletException,IOException 28 doGet(request,response);29 30 3.1.2 登录模块的实现o“cn.edu.zzti.servlet.LoginServlet”代码如下:1 WebServlet(/servlet/LoginServlet)2 pu

8、blic class LoginServlet extends HttpServlet 3 public String checkLogin(User user)4String errorInfo=null;5if(user.getUsername()=null|.equals(user.getUsername().trim()6|user.getPassword()=null|.equals(user.getPassword().trim()7errorInfo=用户名或者密码不能为空;89return errorInfo;1011 public void doGet(HttpServlet

9、Request request,HttpServletResponse response)12 throws ServletException,IOException 13 doPost(request,response);14 15 public void doPost(HttpServletRequest request,HttpServletResponse response)16 throws ServletException,IOException 17 request.setCharacterEncoding(utf-8);18 String username=request.ge

10、tParameter(username);19 String password=request.getParameter(password);20 User user=new User(username,password,new Date();21 String error=checkLogin(user);22 String targetPath=IndexView;23 if(error=null)24 /登录成功,对登录信息进行保存25request.setAttribute(username,user);26 else27 /登录失败,返回登录页面,并将错误信息带回28 targetP

11、ath=LoginPageView;29 request.setAttribute(error,error);30 31 request.getRequestDispatcher(targetPath).forward(request,response);32 33 3.1.2 登录模块的实现o“cn.edu.zzti.servlet.view.IndexView”代码如下:1 WebServlet(/servlet/IndexView)2 public class IndexView extends HttpServlet 3 public void doGet(HttpServletReq

12、uest request,HttpServletResponse response)4 throws ServletException,IOException 5 Object loginTag=request.getAttribute(user);6if(loginTag=null)7response.sendRedirect(LoginPageView?error=+8URLEncoder.encode(尚未登录,gbk);9return;1011User user=(User)loginTag;12 response.setContentType(text/html;charset=gb

13、k);13 PrintWriter out=response.getWriter();14 out.println();15 out.println();16 out.println(Web应用首页);17 out.println();18 out.println(当前登录的用户是:+user.getUsername();19 SimpleDateFormat sdf=new SimpleDateFormat(yyyy-MM-dd HH:mm:ss);20 out.println(登录时间:+sdf.format(user.getLoginTime();21 out.println(进入首页)

14、;22 out.println(查看个人信息);23 out.println(完善个人信息);24 out.println();25 out.println();26 out.flush();27 out.close();28 29 public void doPost(HttpServletRequest request,HttpServletResponse response)30 throws ServletException,IOException 31 doGet(request,response);32 33 3.1.2 登录模块的实现o 假如在图3.2所示的页面中,单击“进入首页

15、”的超级链接o 在该次对Web首页的请求中,将因为无法获得登录者信息而跳转至登录页面,如图3.8所示。图3.8 跳转至登录页面图3.2 个人信息首页3.2 Cookieo HTTP是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录.o 如何解决上述问题?n Cookien Session3.2 Cookieo3.2.1 Cookie简介o3.2.2 Cookie在登录中的应用o3.2.3 Cookie详解3.2.1 Cookie简介o Cookie实际上是服务器在客户端浏览器上存储的小段文本,并通过每一个请求发送至同一个服务器。Web服务

16、器用HTTP报头向客户端发送Cookie,客户端浏览器解析这些Cookie并将它们保存为一个本地文件。服务器服务器set-cookie user=admin;Expires=Wen,12-Apr-2017 04:38-55 GMT 保保 存存Cookie文文 件件 读取读取 Cookie 文件文件 cookie user=admin客户端客户端user=admin&pw=123456&login=auto3.2.1 Cookie简介o 在Java EE中,使用“javax.servlet.http.Cookie”类来代表一个Cookie。Cookie对象可以看作是一个key-value对,ke

17、y和value都是String类型:public Cookie(String name,String value)3.2.1 Cookie简介o 客户端浏览器接收到Cookie并进行存储,在后续的请求中会自动添加这个Cookie信息,服务端需要借助于“javax.servlet.http.HttpServletResponse”的addCookie()方法来获取客户端传递来的Cookie信息,最终实现信息共享。public void addCookie(Cookie cookie)3.2.2 Cookie在登录中的应用o 登录解决思路:n在3.1.2节中的会话问题中,服务器端可以创建Cooki

18、e对象,将用户的登录信息保存在该Cookie对象中,然后通过HTTP响应消息写回到客户端。之后,客户端的每次请求都将会带上该登录信息,从而解决会话状态保持问题。n将Cookie对象通过HTTP响应消息写回客户端时,首先修改“cn.edu.zzti.servlet.LoginServlet”类的doPost()方法,当用户登录系统后,将用户的登录信息通过HTTP响应消息写回客户端,修改后的LoginServlet中doPost方法的核心代码(完整代码参考P83)如下:7 String error=checkLogin(user);8 String targetPath=IndexView;9 i

19、f(error=null)10 Cookie cookie1=new Cookie(username,user.getUsername();11 Cookie cookie2=new Cookie(loginTime,user.getLoginTime();12 response.addCookie(cookie1);13 response.addCookie(cookie2);14 cookie保存会话登录模块示例源码:loginDemo(ch3-2)3.2.2 Cookie在登录中的应用o 登录解决思路:n在“javax.servlet.http.HttpServletRequest”中提

20、供了getCookies()方法,该方法可以获取HTTP请求所发送的所有Cookie信息,因为客户端发送的Cookie可以是0到多个,所以getCookies方法返回的是Cookie数组。在工程中添加类“cn.edu.zzti.util.CookieUtil”来完成对Cookie的访问,具体代码如下。/*从cookie数组中查询键值为key的Cookie对象*param cookies*param key*return*/public static Cookie getCookie(Cookie cookies,String key)if(cookies!=null)for(Cookie co

21、okie:cookies)if(key!=null&key.equals(cookie.getName()return cookie;return null;3.2.2 Cookie在登录中的应用o 登录解决思路:n在“javax.servlet.http.HttpServletRequest”中提供了getCookies()方法,该方法可以获取HTTP请求所发送的所有Cookie信息,因为客户端发送的Cookie可以是0到多个,所以getCookies方法返回的是Cookie数组。在工程中添加类“cn.edu.zzti.util.CookieUtil”来完成对Cookie的访问,具体代码如下

22、。/*从cookie数组中查询键值为key的Cookie的value值*param key*param cookies*return*/public static String getValue(String key,Cookie cookies)if(cookies!=null)for(Cookie cookie:cookies)if(key!=null&key.equals(cookie.getName()return cookie.getValue();return null;3.2.2 Cookie在登录中的应用o 登录解决思路:n改写“cn.edu.zzti.servlet.Inde

23、xView”类的doPost方法,增加登录判断的相关代码,具体实现如下。public void doPost(HttpServletRequest request,HttpServletResponse response)2 throws ServletException,IOException 3 request.setCharacterEncoding(gbk);4 Cookie cookies=request.getCookies();5if(CookieUtil.getValue(username,cookies)=null)6response.sendRedirect(LoginPa

24、geView?error=+URLEncoder.7encode(尚未登录,utf-8);8return;910String username=CookieUtil.getValue(username,cookies);11String loginTime=CookieUtil.getValue(logintime,cookies);12 response.setContentType(text/html;charset=utf-8);13 PrintWriter out=response.getWriter();14 out.println();15 out.println();16 out

25、.println(Web应用首页);17 out.println();18 out.println(当前登录的用户是:+username);19 out.println(登录时间:+loginTime);20 out.println(进入首页);21 out.println();22 out.println();23 out.flush();24 out.close();25 3.2.3 Cookie详解o Cookie本身是保存在客户端浏览器中的一段文本,Cookie能否成功存储取决于浏览器的设置。3.2.3 Cookie详解o Cookie的内容主要包括名字、值、过期时间、路径和域。路径与

26、域一起构成了Cookie的作用范围。3.2.3 Cookie详解o Java EE中的javax.servlet.http.Cookie类提供了对Cookie的上述各个属性进行操作的API,如表3.1所示。序 号方 法描 述1Cookie(String name,String value)实例化Cookie对象2public String getName()取得Cookie的名字3public String getValue()取得Cookie的值4public void setValue(String newValue)设置Cookie的值5public void setMaxAge(int

27、 expiry)设置Cookie的最大保存时间,即Cookie有效期6public int getMaxAge()获取Cookies的有效期7public void setPath(String uri)设置Cookies的有效路径8public String getPath()获取Cookies的有效路径9public void setDomain(String pattern)设置Cookies的有效域10public String getDomain()获取Cookies的有效域表3.1Cookie的API3.2.3 Cookie详解o 利用以上API完成有效时间和有效域的设置,详见P8

28、8。3.3 Sessiono 通过Cookie实现了登录信息共享问题,但是该方法主要是依靠客户端浏览器开发及服务器端Cookie写入的功能。如果客户端浏览器不接收任何Cookie,那么就无法实现登录信息的共享。如何解决上述问题?n Session3.3 Sessiono3.3.1 HttpSession简介o3.3.2 HttpSession在登录中的应用o3.3.3 HttpSession详解3.3.1 HttpSession简介o HttpSession对象是Session概念在Java Web中的具体实现,通过这个对象可以实现服务端同一会话的多次请求之间的数据共享。o HttpSessi

29、on对象是通过HttpServletRequest获得的,HttpServletRequest共包含两个获取HttpSession对象的方法,如下所示:npublic HttpSession getSession(boolean create)npublic HttpSession getSession()3.3.1 HttpSession简介o 其中,getSession(true)与getSession()的含义相同,如果当前reqeust中的HttpSession为null,当create变量的值为true时,就创建一个新的HttpSession对象,否则返回当前HttpSession对

30、象。getSession(false)的含义是,如果当前reqeust中的HttpSession为null,返回null,否则返回当前HttpSession对象。3.3.1 HttpSession简介o HttpSession用于会话管理的4个方法为:npublic void setAttribute(String name,Object value)npublic Object getAttribute(String name)npublic Enumeration getAttributeNames()npublic Object removeAttribute(String name)n

31、getAttribute(String name,Object value)其中,getAttribute(String name,Object value)方法与HttpServletRequest对象的setAttribute(String name,Object value)方法作用一致,都是将一个对象存放于某个空间,以方便对象在资源之间进行共享。两者之间的区别在于,HttpServletRequest对象存储的数据只能在同一次请求的不同资源之间实现共享,而HttpSession对象存储的数据可以在同一个会话的不同请求之间进行共享,数据共享的范围更为广泛。3.3.1 HttpSessio

32、n简介o 思考:n实现一个Servlet类SessionDemo1。在该类中获得当前会话的HttpSession对象,并在这个HttpSession对象中存储一个key为“info”的字符串对象“存放于session中的信息”,并提供一个超级链接,访问另外一个Servlet资源,以方便发送一个新的请求,具体代码如P93。Session保存会话登录模块示例源码:loginDemo(ch3-3)3.3.2 HttpSession在登录中的应用o 当一个浏览器窗口发出一个请求,并且Web应用服务第一次调用HttpServletRequest的getSession()或者getSession(true

33、)的时候,当前浏览器窗口与Web应用服务之间建立了会话。在默认情况下,只要当前建立会话的浏览器窗口没有关闭,该会话就不会结束。因此,若要在浏览器与Web应用服务之间保持会话信息,可以使用HttpSession来保存请求之间的相关信息。3.3.2 HttpSession在登录中的应用o 在第3.1.2节中,出现的登录信息的保持问题,在这里就可以使用HttpSession进行解决。用户登录信息被提交给cn.edu.zzti.servlet.LoginServlet时,LoginServlet将该登录信息存储至HttpSession中,这样在当前浏览器窗口下,发送的所有请求都可以共享HttpSess

34、ion中的登录信息,具体代码实现如下。3.3.2 HttpSession在登录中的应用1 WebServlet(/servlet/LoginServlet)2 public class LoginServlet extends HttpServlet 3 public String checkLogin(User user)/*代码略,看第3.1.2节*/4 public void doPost(HttpServletRequest request,HttpServletResponse response)5 throws ServletException,IOException 6 requ

35、est.setCharacterEncoding(utf-8);7 String username=request.getParameter(username);8 String password=request.getParameter(password);9 User user=new User(username,password,new Date();10 String error=checkLogin(user);11 String targetPath=IndexView;12 if(error=null)13 /将获取的登录信息存在HttpSession中14 request.ge

36、tSession().setAttribute(user,user);15 else16 /登录失败,返回登录页面,并将错误信息带回17 targetPath=LoginPageView;18 request.setAttribute(error,error);19 20 request.getRequestDispatcher(targetPath).forward(request,response);21 22 /*代码略,请查看第3.1.2节*/23 3.3.3 HttpSession详解序 号方 法 名说 明1Object getAttribute(Stringname)用于从当前Ht

37、tpSession对象中返回指定名称的属性对象2Enumeration getAttributeNames()返回和会话有关的枚举值3String getId()返回分配给这个Session的标识符。一个HTTP session的标识符是一个由服务器来建立和维持的唯一的字符串4int getMaxInactiveInterval()用于获得当前HttpSession对象可空闲的以秒为单位的最长时间5Object getValue(Stringname)获取指定名称的Session对象。如果不存在这样的绑定,返回空值6String getValueNames()以一个数组返回绑定到Session

38、上的所有数据的名称7boolean isNew()判断当前HttpSession对象是否是新创建的8void removeAttribute(Stringname)用于从当前HttpSession对象中删除指定名称的属性9void removeValue(Stringname)取消指定名称在Session上的绑定10void setAttribute(Stringname,Objectvalue)用于将一个对象与一个名称关联后存储到当前的HttpSession对象中11void setMaxInactiveInterval(int interval)用于设置当前HttpSession对象可空闲

39、的最长时间,以秒为单位。也就是修改当前会话的默认超时间隔3.4 Session工作原理o 与Cookie不同,Session采用在服务器端保持状态的解决方案。o Session是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是哪个用户的Session变量,这个值是通过用户浏览器在访问的时候返回给服务器,当客户禁用Cookie时,这个值也能设置为get来返回给服务器。3.4 Session工作原理o 就安全性来说,当访问一个使用Session 的站点时,需要在自己的计算机中建立一个Cookie。因此,为安全起见,用户使用时建议采用服务器端的Session机制,因为它不会

40、任意读取客户存储的信息。o HttpSession在实际工作中是依靠Cookie来实现的,Cookie在HttpSession的工作中起到保护数据的作用3.5 个人信息模块的实现图3.3 完善个人信息1图3.4 完善个人信息2图3.5 查看个人信息详情3.5 个人信息模块的实现o 首先,需要新建一个完善个人信息表单页面“cn.edu.zn.servlet.view.PersonalPage1”,表单效果如图3.3所示,并在当前页面中同样显示登录信息,具体代码如P98。o 在“cn.edu.zn.servlet.view.PersonalPage1”中填写的个人信息表单并不完整,还需要与一个完善

41、个人信息表单页面“cn.edu.zn.servlet.view.PersonalPage2”中的数据整合后,才能变成完整的用户个人信息。表单效果如图3.4所示,并在当前页面中同样显示登录信息,具体代码如P99示例源码:loginDemo(ch3-5)3.5 个人信息模块的实现o 在“cn.edu.zzti.servlet.PersonalServlet”类中对用户填写的所有表单数据进行封装、存储.1 WebServlet(/servlet/PersonalInfoProcess)2 public class PersonalInfoProcess extends HttpServlet.7 p

42、ublic void doPost(HttpServletRequest request,HttpServletResponse response)8 throws ServletException,IOException 9 request.setCharacterEncoding(utf-8);10 Object loginTag=request.getSession().getAttribute(user);11 if(loginTag=null)12 response.sendRedirect(LoginPageView);13 return;14 15 User user=(User

43、)loginTag;16 Object personalObject=request.getSession().getAttribute(p);17if(personalObject=null)18 request.setAttribute(info,您还没有完善个人信息,请进行完善);19 request.getRequestDispatcher(PersonalPage1).forward(request,response);20return;21else22String targetPath=PersonalInfoView;23PersonalInfo p=(PersonalInfo)

44、request.getSession().getAttribute(p);24p.setHighestEducation(request.getParameter(highestEducation);25p.setGraduateSchool(request.getParameter(graduateSchool);26p.setMajor(major);27response.sendRedirect(targetPath);/使用跳转重定向到展示页282930 3.6 基于MVC的临时购物车o 1979年,Trygve Reenskaug首次提出了MVC的概念,最初的时候叫作Model-Vi

45、ew-Controller-Editor。Trygve Reenskaug最初提出MVC的目的是为了把模型与视图分离开来,然后用控制器来组合Model和View之间的关系。这样做的目的是实现注意点分离的设计理念,也就是让专业的对象做专业的事情,View负责视图相关的内容,Model负责描述数据模型,Controller负责总控,各自分工协作。3.6 基于MVC的临时购物车o3.6.1 临时购物车设计需求o3.6.2 临时购物车代码实现o3.6.3 Cookie详解3.6.1 临时购物车设计需求o在临时购物车中,需要购买的商品列表页面如图3.21所示。每个商品均包含有商品序号、商品名称和商品价格

46、等信息。任意用户在商品列表页面都可以对商品进行购买。每当用户对某个商品输入购买数量后,单击“加入购物车”按钮,就会转向临时购物车页面,实现效果如图3.22所示。如果用户需要继续购买,则可以通过一个超级链接返回商品列表页面,也可以对购物车中的现有商品进行删除操作。图3.21 商品列表图3.22 临时购物车列表临时购物车示例源码:loginDemo(ch3-6)3.6.2 临时购物车代码实现o首先,对临时购物车中的数据模型(Model)进行分析。为了表示商品对象,需要定义商品类Goods,包含商品名称、价格、数量等私有属性及其相应的get和set方法,具体实现代码如下所示。1 public cla

47、ss Goods 2 private String name;3 private float price;4 private int number;5 public String getName()6 return name;7 8 public void setName(String name)9 this.name=name;10 11 public float getPrice()12 return price;13 14 public void setPrice(float price)15 this.price=price;16 17 public int getNumber()18

48、 return number;19 20 public void setNumber(int number)21 this.number=number;22 23 3.6.2 临时购物车代码实现o为了在页面中展示商品列表,定义GoodsStore类,完成商品信息的初始化工作。此处,采用ArrayList对象进行存储,并将其放在静态代码块中,保证代码的优先执行。具体实现代码如下所示。1 public class GoodsStore 2 public static List goodsList=new ArrayList();3 static4 for(int i=0;i10;i+)5 good

49、sList.add(new Goods(商品+(i+1),50+i*10,0);6 7 8 3.6.2 临时购物车代码实现o定义好相关数据模型后,接下来定义商品列表展示页面,即完成临时购物车中视图(View)层的展示。因此,定义GoodsList类并使其继承HttpServlet,进行商品列表信息的页面展示。临时购物车中每个商品都可以加入购物车,当用户单击“加入购物车”按钮时,将其交给临时购物车中的控制层,即在代码中定义“加入购物车”的action为“ShopCardController?type=addCard”。类似的,当用户在页面中单击“查看购物车”超链接时,将其转交给控制层,即将“查看购物车”的超链接定义为o“查看购物车”。具体代码如P105所示。o根据MVC的设计理念,控制层负责数据模型和视图的交互。在临时购物车的商品列表页面中,当用户单击“加入购物车”按钮后,会将当前的商品所在表单提交给ShopCardController。该类的具体代码如P106所示。3.6.2 临时购物车代码实现o用户在商品列表中选择商品后进入购物车页面,可以查看购物车中所选择的商品列表。购物车ShopCard类的代码如P107。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(Java-Web程序设计与案例教程-第3章-Cookie与Session.ppt)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|