31

怎么破解注册码的软件

 4 years ago
source link: https://segmentfault.com/a/1190000022094982
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

一、什么是JavaWeb?

  • JavaWeb是用Java技术来解决相关web互联网领域的技术总称。
  • 需要在特定的web服务器上运行,分为web服务器和web客户端两部分
  • 跨平台,能够在多个平台下部署和运行

二、静态网页和动态网页

  • 静态网页:网页中的内容是固定的,不会更新。
  • 所用技术为html、css;
  • 动态网页:网页中的内容通过程序动态显示的,自动更新。
  • 所用技术为html、css、数据库、至少一门高级语言(Java、C#,PHP),JavaScript,XML等,主流的动态网页脚本技术(jsp/Asp.net/php)

三、Tomcat服务器目录介绍

uqYf6zu.png!web

  • WEB-INF是Java的Web应用的安全目录。所谓安全就是客户端无法访问,只有服务端可以访问的目录。
  • web.xml文件是项目的部署文件
  • classes文件夹,用于放置*.class文件
  • lib文件夹,用于存放需要的jar包

如图:

四、修改Tomcat服务器默认端口

  • 在Tomcat的安装目录下,找到conf-->server.xml文件
  • 找到Connector标签
  • 修改port属性的值即可,端口修改完成后要记得保存,并且重启Tomcat服务器。

二、JSP基础学习

一、JSP简介

JSP全名为Java Server Pages,其根本是一个简化的Servlet设计,他实现了再Java当中使用HTML标签。JSP是一种动态网页技术标准也是JavaEE的标准。JSP与Servlet一样,是在服务器端执行的。

JSP实际上就是Servlet。JSP这门技术的最大的特点在于:写jsp就像在写html,但它相比html而言,html只能为用户提供静态数据,而 Jsp技术允许在页面中嵌套java代码,为用户提供动态数据

二、JSP的作用

Servlet:服务器端的小应用程序。适合编写Java逻辑代码,如果编写网页内容------->费时费力,太苦

  • 缺点:不适合设置HTML响应体,需要大量的
  • response.getWriter().print("");
  • 优点:动态资源,可以编程。

HTML:静态内容

  • 缺点:HTML是静态页面,不能包含动态信息;
  • 优点:不用为输出html标签而发愁。

jsp(java server pages):适合编写输出动态内容,但不适合编写Java逻辑

  • 优点:在原有HTML的基础上添加java脚本,构成jsp页面。

三、JSP和Servlet的分工

JSP

  • 作为请求发起页面,例如显示表单、超链接。
  • 作为请求结束页面,例如显示数据。

Servlet

  • 作为请求中处理数据的环节

四、JSP的组成

jsp=html+java脚本+jsp标签(指令)

jsp中无需创建即可使用的对象一共有9个,称为九大内置对象。

3种java脚本:

  • <%……%> java代码片段(常用),用于定义0-N条java语句,方法内写什么就可以在这里写什么,不能声明方法和类;
  • <%=……%> java表达式,用于输出(常用),用于输出一条表达式(或变量)的结束,print()括号中参数可以放什么,这里就能放什么;
  • <%!……%> 声明,用来创建类的成员变量和成员方法(基本不用),class A{ } 类体中可以放什么,这里就可以放什么。

五、JSP的执行流程及原理

jsp其实是一种特殊的Servlet

  • 当jsp页面第一次被访问时,服务器会把jsp编译成java文件(这个java其实是一个Servlet类);
  • 然后再把java编译成.class;
  • 然后创建该类对象;
  • 最后调用它的service()方法;
  • 第二次请求同一jsp时,直接调用service()方法。
  • 在Tomcat的work目录下可以找到jsp对应的.java源代码。

1、IE浏览器在访问JSP页面时,Web服务器是如何调用并执行一个jsp页面的?(Servlet)

  • 第一次:转译(翻译) --> 编译 --> 执行
  • 第二次:执行

2、Web服务器在执行jsp页面时,是如何把Jsp页面中的html排版标签发送到客户端的?

  • out.print("<......>"); 或者 out.write("<......>");

3、Jsp页面中的java代码服务器是如何执行的?

  • 服务器 --> .java文件 --> .class文件 --> 结果out回客户端

4、Web服务器在调用jsp时,会给jsp提供一些什么java对象(内置对象)?

  • HttpSession、ServletConfig、ServletContent、request、response、out等等。

六、JSP的基本语法

Servlet:控制器。重点编写java代码逻辑。(获取表单数据、处理业务逻辑、分发转向)

JSP:代码显示模板。重点在于显示数据。(为什么显示数据不直接用.html文件呢?因为.jsp文件中可以插入java代码显示回显消息,简言之,jsp功能更强大)

JSP的模版元素:简言之就是网页的静态内容

例如:html标签和普通文本。

JSP的脚本:

  • <%……%> java代码片段(常用),用于定义0-N条java语句,方法内写什么就可以在这里写什么,不能声明方法和类;
  • <%=……%> java表达式,用于输出(常用),用于输出一条表达式(或变量)的结束,print()括号中参数可以放什么,这里就能放什么;

<%= 2 + 3 %> 等价于out.print(2 + 3);

  • <%!……%> 声明,用来创建类的成员变量和成员方法(基本不用),class A{ } 类体中可以放什么,这里就可以放什么。

注释:

  • JSP注释:<%-- 被注释的内容 --%>

特点:安全,省流量

  • 网页注释:

特点:不安全,费流量

七、JSP的三个指令

JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。

在JSP 2.0规范中共定义了三个指令:

  • page指令(页面级别)
  • include指令(导入其它页面的信息)
  • taglib指令(标签指令)

例如:

1、page

作用:

  • page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面。
  • 为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。

属性:

  • import和java代码中的import是一样的

<%@ page import="java.util.Date, java.util.List" %>

或者:

<%@ page import="java.util.Date" %>

<%@ page import="java.util.List" %>

  • JSP会自动导入(默认导入)以下的包:

import java.lang.*;

import javax.servlet.*;

import javax.servlet.http.*;

import javax.servlet.jsp.*;

  • session: 表示是否会自动创建session对象。其默认值是true。
  • buffer: JSP中有javax.servlet.jsp.JspWriter输出字符流。设置输出数据的缓存大小,默认大小是8kb。建议最好不要改大小。
  • errorPage: 如果页面中有错误,则跳转到指定的资源。(即不让页面弹出404/500等错误) errorPage="/uri"

如果写"/"则代表当前应用的目录下,绝对路径。

如果不写"/"则代表相对路径。

  • isErrorPage: 表示是否创建throwable对象。其默认值是false。作用:输出页面错误信息:by zero
  • contextType: contentType="text/html; charset=UTF-8" 告诉浏览器使用什么编码来解析文本。等同于 response.setContextType("text/html; charset=utf-8");
  • pageEncoding: 告诉JSP引擎(服务器)要转译(翻译)的文件使用的编码。

例如:<%@ page pageEncoding="gbk" %>

  • isELIgnored: 是否支持EL表达式。 默认是false,表示支持EL表达式。

例如:${1+1} 等价于out.print(1+1);

2、include

include指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入。

  • 静态包含:把其它资源包含到当前页面中。

<%@ include file="/include/header.jsp" %>

  • 动态包含:

<jsp:include page="/include/header.jsp"></jsp:include>

两者的区别:转译(翻译)的时间段不同

  • 前者:在翻译时就把两个文件合并
  • 后者:不会合并文件,当代码执行到include时,才包含另一个文件的内容。

使用原则:能用静的就不用动的。原因之一是:可以省略一些代码的书写。

3、taglib

JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合。

Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。

Taglib指令的语法:

<%@ taglib uri="uri" prefix="prefixOfTag" %>
复制代码

uri属性确定标签库的位置,prefix属性指定标签库的前缀。

等价的XML语法:

<jsp:directive.taglib uri="uri" prefix="prefixOfTag" />
复制代码

作用:在JSP页面中导入JSTL标签库。替换jsp中的java代码片段。

<%@ taglib uri=" java.sun.com/jsp/jstl/co… " prefix="c" %>

prefix:前缀(相当于重新给uri起个名字)

示例:

<%  
 
  if (5 > 3) {
 
  out.print(5);
 
  }
 
%>
 
<%-- 上下二种方式是等价的 --%>
 
<c:if test="${5>3}">
 
  aaa
 
</c:if>
复制代码

下面的这种方式很好用!后面慢慢体会。

八、JSP的动作

使用标签的形式来表示一段java代码。

JSP行为标签使用XML语法结构来控制servlet引擎。它能够动态插入一个文件,重用JavaBean组件,引导用户去另一个页面,为Java插件产生相关的HTML等等。

行为标签只有一种语法格式,它严格遵守XML标准:

<jsp:action_name attribute="value" />
复制代码

行为标签基本上是一些预先就定义好的函数,下表罗列出了一些可用的JSP行为标签:

九、JSP的九个内置对象

指在JSP的<%=%> 和<% %>中可以直接使用的对象,服务器给我们创建好的对象,直接拿过来用就行了。

例如:

<%=request.getParameter("name") %>
 
<%
 
   Student stu = new Student();
 
   stu.setName("tom");
 
   out.print(stu.getName());
 
   // request.getRequestDispatcher("/7.jsp").forward(request, response);
 
 %>
复制代码

十、JSP客户端请求

1、HttpServletRequest类

request对象是javax.servlet.http.HttpServletRequest类的实例。每当客户端请求一个页面时,JSP引擎就会产生一个新的对象来代表这个请求。

request对象提供了一系列方法来获取HTTP信息头,包括表单数据,cookies,HTTP方法等等。

接下来将会介绍一些在JSP编程中常用的获取HTTP信息头的方法。详细内容请见下表:

2、HTTP信息头示例

在这个例子中,我们会使用HttpServletRequest类的getHeaderNames()方法来读取HTTP信息头。这个方法以枚举的形式返回当前HTTP请求的头信息。

获取Enumeration对象后,用标准的方式来遍历Enumeration对象,用hasMoreElements()方法来确定什么时候停止,用nextElement()方法来获得每个参数的名字

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
<h2>HTTP 头部请求实例</h2>
<table width="100%" border="1" align="center">
<tr bgcolor="#949494">
<th>Header Name</th><th>Header Value(s)</th>
</tr>
<%
   Enumeration headerNames = request.getHeaderNames();
   while(headerNames.hasMoreElements()) {
      String paramName = (String)headerNames.nextElement();
      out.print("<tr><td>" + paramName + "</td>\n");
      String paramValue = request.getHeader(paramName);
      out.println("<td> " + paramValue + "</td></tr>\n");
   }
%>
</table>
</body>
</html>
复制代码

十一、JSP服务器响应

1、HttpServletResponse类

response 对象是 javax.servlet.http.HttpServletResponse 类的一个实例。就像服务器会创建request对象一样,它也会创建一个客户端响应。

response对象定义了处理创建HTTP信息头的接口。通过使用这个对象,开发者们可以添加新的cookie或时间戳,还有HTTP状态码等等。

下表列出了用来设置HTTP响应头的方法,这些方法由HttpServletResponse 类提供:

2、HTTP响应头程序示例

接下来的例子使用setIntHeader()方法和setRefreshHeader()方法来模拟一个数字时钟:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
<h2>自动刷新实例</h2>
<%
   // 设置每隔5秒自动刷新
   response.setIntHeader("Refresh", 5);
   // 获取当前时间
   Calendar calendar = new GregorianCalendar();
   String am_pm;
   int hour = calendar.get(Calendar.HOUR);
   int minute = calendar.get(Calendar.MINUTE);
   int second = calendar.get(Calendar.SECOND);
   if(calendar.get(Calendar.AM_PM) == 0)
      am_pm = "AM";
   else
      am_pm = "PM";
   String CT = hour+":"+ minute +":"+ second +" "+ am_pm;
   out.println("当前时间: " + CT + "\n");
%>
</body>
</html>
复制代码

十二、JSP表单处理

我们在浏览网页的时候,经常需要向服务器提交信息,并让后台程序处理。浏览器中使用 GET 和 POST 方法向服务器提交数据。

1、GET 方法

GET方法将请求的编码信息添加在网址后面,网址与编码信息通过"?"号分隔。如下所示:

www.runoob.com/hello?key1=… GET方法是浏览器默认传递参数的方法,一些敏感信息,如密码等建议不使用GET方法。

用get时,传输数据的大小有限制 (注意不是参数的个数有限制),最大为1024字节。

2、POST 方法

一些敏感信息,如密码等我们可以通过POST方法传递,POST提交数据是隐式的。

POST提交数据是不可见的,GET是通过在url里面传递的(可以看一下你浏览器的地址栏)。

JSP使用getParameter()来获得传递的参数,getInputStream()方法用来处理客户端的二进制数据流的请求。

3、JSP 读取表单数据

  • getParameter(): 使用 request.getParameter() 方法来获取表单参数的值。
  • getParameterValues(): 获得如checkbox类(名字相同,但值有多个)的数据。 接收数组变量 ,如checkbox类型
  • getParameterNames():该方法可以取得所有变量的名称,该方法返回一个 Enumeration。
  • getInputStream():调用此方法来读取来自客户端的二进制数据流。
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>表单信息</title>
</head>
<body>
 
<form action="Demo1.jsp" method="post">
    <input type="text" name="name"/><br>
    <input type="text" name="url"/><br>
    <input type="checkbox" name="mao" checked="checked"/>猫<br>
    <input type="checkbox" name="gou"/>狗<br>
    <input type="checkbox" name="ji" checked="checked"/>鸡<br>
    <input type="checkbox" name="ya"/>鸭<br>
 
    <input type="submit" value="提交">
 
</form>
</body>
</html>
复制代码
<%@ page import="java.util.Enumeration" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>JSP</title>
</head>
<body>
 
    <h1>读取参数信息</h1>
    <table align="center" border="1" width="100%">
        <tr bgcolor="#f0f8ff">
            <th>参数名</th>
            <th>对应值</th>
        </tr>
 
            <%
                Enumeration<String> parameterNames = request.getParameterNames();
                request.setCharacterEncoding("utf-8");
                while (parameterNames.hasMoreElements()){
                    String name = parameterNames.nextElement();
                    out.println("<tr><td>"+name+"</td>\n");
                    String url = request.getParameter(name);
                    out.println("<td>"+url+"</td></tr>\n");
                }
            %>
 
    </table>
    <%
 
    %>
 
</body>
</html>
复制代码

十三、四大域对象:实际开发如何用?

PageContext:pageConext

存放的数据仅在当前页面有效。开发时使用较少。当前页面存放数据用表单标签中的 ,且该存值方式用户看不到。

ServletRequest: request

存放的数据在一次请求(转发:可以传数据)内有效。使用非常多。

HttpSession: session

存放的数据在一次会话(多次请求)中有效。使用的比较多。例如:存放用户的登录信息、购物车功能。

ServletContext: application

存放的数据在整个应用范围内都有效。因为范围太大,应尽量少用。用于统计在线人数。

十四、会话跟踪

1、 会话概述

  • 什么是会话?如同打电话。

会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。

  • 会话过程要解决的问题是什么?保持各个客户端自己的数据。

每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据。

例如:用户点击超链接通过一个servlet购买了一个商品,程序应该想办法保存用户购买的商品,以便于用户点结帐servlet时,结帐servlet可以得到用户购买的商品为用户结帐。

思考:用户购买的商品保存在request或servletContext中行不行?答:不行。

保存会话数据的两种技术:

  • Cookie:是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。

当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。

  • HttpSession:Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的HttpSession对象,

由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

2、http协议的无状态性

无状态是指,当浏览器发送请求给服务器时,服务器响应客户端请求。但是当同一个浏览器再次发送请求给服务器时,服务器并不知道它就是刚才那个浏览器。简单来说,就是服务器不会去记得你,所以就是无状态协议。

3、JSP Cookie 处理

Cookie是存储在客户机的文本文件,它们保存了大量轨迹信息。在servlet技术基础上,JSP显然能够提供对HTTP cookie的支持。

通常有三个步骤来识别回头客:

  • 服务器脚本发送一系列cookie至浏览器。比如名字,年龄,ID号码等等。
  • 浏览器在本地机中存储这些信息,以备不时之需。
  • 当下一次浏览器发送任何请求至服务器时,它会同时将这些cookie信息发送给服务器,然后服务器使用这些信息来识别用户或者干些其它事情。

JSP Cookie 处理需要对中文进行编码与解码,方法如下:

String   str   =   java.net.URLEncoder.encode("中文","UTF-8");            //编码
String   str   =   java.net.URLDecoder.decode("编码后的字符串","UTF-8");   // 解码
复制代码

4、Servlet Cookie 方法

5、使用JSP设置Cookie

使用JSP设置cookie包含三个步骤:

  • 1、创建一个Cookie对象: 调用Cookie的构造函数,使用一个cookie名称和值做参数,它们都是字符串。
Cookie cookie = new Cookie("key","value");
复制代码

请务必牢记,名称和值中都不能包含空格或者如下的字符:

[ ] ( ) = , " / ? @ : ;
复制代码
  • 2、设置有效期:调用setMaxAge()函数表明cookie在多长时间(以秒为单位)内有效。下面的操作将有效期设为了24小时。
cookie.setMaxAge(60*60*24);
复制代码
  • 3、将cookie发送至HTTP响应头中:调用response.addCookie()函数来向HTTP响应头中添加cookie。
response.addCookie(cookie);
复制代码

6、实例说明

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>表单提交</title>
</head>
<body>
 
<form action="CookieDemo.jsp" method=GET>
    站点名: <input type="text" name="name">
    <br />
    网址: <input type="text" name="url" />
    <input type="submit" value="提交" />
</form>
 
</body>
</html>
复制代码
<%@ page import="java.net.URLEncoder" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<%
    // 编码,解决中文乱码
    String str = URLEncoder.encode(request.getParameter("name"),"utf-8");
    // 设置 name 和 url cookie
    Cookie name = new Cookie("name", str);
    Cookie url = new Cookie("url", request.getParameter("url"));
 
    // 设置cookie过期时间为24小时。
    name.setMaxAge(60*60*24);
    url.setMaxAge(60*60*24);
 
    // 在响应头部添加cookie
    response.addCookie( name );
    response.addCookie( url );
%>
<html>
<head>
    <title>设置 Cookie</title>
</head>
<body>
 
<h1>设置 Cookie</h1>
 
<ul>
    <li><p><b>网站名:</b>
        <%= request.getParameter("name")%>
    </p></li>
    <li><p><b>网址:</b>
        <%= request.getParameter("url")%>
    </p></li>
</ul>
</body>
</html>
复制代码

7、使用 JSP 读取 Cookie

想要读取cookie,您就需要调用request.getCookies()方法来获得一个javax.servlet.http.Cookie对象的数组,然后遍历这个数组,使用getName()方法和getValue()方法来获取每一个cookie的名称和值。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.net.*" %>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>获取 Cookie</title>
</head>
<body>
<%
    Cookie cookie = null;
    Cookie[] cookies = null;
    // 获取cookies的数据,是一个数组
    cookies = request.getCookies();
    if( cookies != null ){
        out.println("<h2> 查找 Cookie 名与值</h2>");
        for (int i = 0; i < cookies.length; i++){
            cookie = cookies[i];
 
            out.print("参数名 : " + cookie.getName());
            out.print("<br>");
            out.print("参数值: " + URLDecoder.decode(cookie.getValue(), "utf-8") +" <br>");
            out.print("------------------------------------<br>");
        }
    }else{
        out.println("<h2>没有发现 Cookie</h2>");
    }
%>
</body>
</html>
复制代码

8、使用JSP删除Cookie

删除cookie非常简单。如果您想要删除一个cookie,按照下面给的步骤来做就行了:

  • 获取一个已经存在的cookie然后存储在Cookie对象中。
  • 将cookie的有效期设置为0。
  • 将这个cookie重新添加进响应头中。

9、实例演示

下面的程序删除一个名为"name"的cookie,当您第二次运行CookieDemo2.jsp时,name 将会为 null。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.net.*" %>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>获取 Cookie</title>
</head>
<body>
<%
    Cookie cookie = null;
    Cookie[] cookies = null;
    // 获取当前域名下的cookies,是一个数组
    cookies = request.getCookies();
    if( cookies != null ){
        out.println("<h2> 查找 Cookie 名与值</h2>");
        for (int i = 0; i < cookies.length; i++){
            cookie = cookies[i];
            if((cookie.getName( )).compareTo("name") == 0 ){
                cookie.setMaxAge(0);
                response.addCookie(cookie);
                out.print("删除 Cookie: " +
                        cookie.getName( ) + "<br/>");
            }
            out.print("参数名 : " + cookie.getName());
            out.print("<br>");
            out.print("参数值: " + URLDecoder.decode(cookie.getValue(), "utf-8") +" <br>");
            out.print("------------------------------------<br>");
        }
    }else{
        out.println("<h2>没有发现 Cookie</h2>");
    }
%>
</body>
</html>
复制代码

10、图解分析

11、Session

  • HttpSession概述

HttpSession是有JavaWeb提供的,用来会话跟踪的类,session是服务器对象,保存在服务器端;

HttpSession是Servlet三大域对象之一(request、session、application),所以它也有setAttribute()、getAttribute()、removeAttribute()方法;

HttpSession底层依赖Cookie,或是URL重写。

  • HttpSession的作用

会话范围:会话范围是某个用户从首次访问服务器开始,到该用户关闭浏览器结束; 会话:一个用户对服务器的多次连贯性请求,所谓连贯性请求,就是该用户多次请求中间没有关闭浏览器。

服务器会为每个客户端创建一个session对象,session就好比客户在服务器端的账户,它们被服务器保存到一个Map中,这个Map被称为session缓存。

Servlet中得到session对象:HttpSession session = request.getSession();

JSP中得到session对象:session是jsp内置对象之下,不用创建就可以直接使用。

12、session域相关方法

void setAttribute(String name,Object val);
 
Object getAttribute(String name);
 
void removeAttribute(String name);
复制代码

13、session保存用户登录信息

案例相关页面和Servlet:

login.jsp:登录页面

LoginSuccess.jsp:只有登录成功才能访问的页面

LoginServlet:校验用户是否登录成功

各页面和Servlet内容:

login.jsp:提供登录表单,提交表单请求LoginServlet

LoginServlet:获取请求参数,校验用户是否登录成功

失败:保存错误信息到request域,转发到login.jsp,在login.jsp中显示request域中的错误信息;

成功:保存用户信息到session域中,重定向到LoginSuccess.jsp页面,显示session域中的用户信息。

LoginSuccess.jsp:从session域获取用户信息,如果不存在,显示“您还没有登录”,存在则显示用户信息;

只要用户没有关闭浏览器,session就一直存在,那么保存在session中的用户信息也就一起存在,那么用户访问LoginSuccess.jsp就会通过

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
    <title>登录页面</title>
</head>
<body>
<%
    //获取cookie的值
    String name = "";
    String pwd = "";
    Cookie[] cs = request.getCookies();
    if(cs!=null){
        for(Cookie c : cs){
            if("username".equals(c.getName())){
                name = c.getValue();
            }
            if("pwd".equals(c.getName())){
                pwd = c.getValue();
            }
        }
    }
%>
<%
    //获取request信息
    String message="";
    String mess = (String)request.getAttribute("message");
    if(mess!=null){
        message = mess;
    }
%>
<h1>用户登录</h1>
<span color="red"><%=message %></span>
<form action="/LoginServlet" method="post">
    <p>
        账号:<input type="text" name="username" value="<%=name %>" />
    </p>
    <p>
        密码:<input type="password" name="pwd" value="<%=pwd %>" />
    </p>
    <p>
        <input type="submit" value="登录">
    </p>
</form>
 
</body>
</html>
复制代码

LoginServlet.java

package com.demo.servlet;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
 
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }
 
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //设置请求的字符编码
        request.setCharacterEncoding("utf-8");
        //接收客户端请求
        String username = request.getParameter("username");
        String pwd = request.getParameter("pwd");
        //判断是否登录成功
        if("admin".equals(username) && "1234".equals(pwd)){
            //登录成功,把信息保存到cookie中
            Cookie c1 = new Cookie("username",username);
            Cookie c2 = new Cookie("pwd",pwd);
            c1.setMaxAge(60*60*24);
            c2.setMaxAge(60*60*24);
            response.addCookie(c1);
            response.addCookie(c2);
            //登录成功,保存用户名到session中,并重定向到LoginSuccess.jsp
            HttpSession session = request.getSession();
            session.setAttribute("username", username);
            response.sendRedirect("/LoginSuccess.jsp");
        }else{
            //转发给客户端“登录失败”
            request.setAttribute("message", "用户信息错误,请重新登录");
            request.getRequestDispatcher("/login.jsp").forward(request, response);
        }
 
    }
}
复制代码

LoginSuccess.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
    <title>登录成功</title>
</head>
<body>
 
<%
    //获取session信息
    String name = (String)session.getAttribute("username");
    if(name==null){
        //session不存在,转发到登录页面,并提示信息
        request.setAttribute("message", "您还没有登录,不能访问页面");
        request.getRequestDispatcher("/login.jsp").forward(request, response);
        //重定向到login.jsp,不会显示request提示的信息
        //response.sendRedirect("/login/login.jsp");
        return;
    }
%>
<h1>登录成功</h1>
你好<%=name %>,欢迎登录!
 
</body>
</html>
复制代码

7fmiIvB.png!web

yArQJjB.png!web

14、隐藏表单域

一个网络服务器可以发送一个隐藏的HTML表单域和一个唯一的session ID,就像下面这样:

<input type="hidden" name="sessionid" value="12345">
复制代码

这个条目意味着,当表单被提交时,指定的名称和值将会自动包含在GET或POST数据中。每当浏览器发送一个请求,session_id的值就可以用来保存不同浏览器的轨迹。

这种方式可能是一种有效的方式,但点击标签中的超链接时不会产生表单提交事件,因此隐藏表单域也不支持通用会话跟踪。

15、重写URL

您可以在每个URL后面添加一些额外的数据来区分会话,服务器能够根据这些数据来关联session标识符。

举例来说, w3cschool.cc/file.htm;se… session标识符为sessionid=12345,服务器可以用这个数据来识别客户端。

相比而言,重写URL是更好的方式来,就算浏览器不支持cookies也能工作,但缺点是您必须为每个URL动态指定session ID,就算这是个简单的HTML页面。

  • session依赖Cookie,目的是让客户端发出请求时归还sessionID,这样才能找到对应的session;
  • 如果客户端禁用了Cookie,那么就无法得到sessionID,那么session也就无用了;
  • 也可以使用URL重写来替代Cookie
  • 让网站的所有超链接、表单中都添加一个特殊的请求参数,即sessionID;
  • 这样服务器可以通过获取请求参数得到sessionID,从而找到session对象;
  • response.encodeURL(String url)该方法会对url进行智能的重写,当请求中没有归还session这个Cookie,那么该方法会重写URL,否则不重写,当然url必须是指向本站的url。

16、session对象

除了以上几种方法外,JSP利用servlet提供的HttpSession接口来识别一个用户,存储这个用户的所有访问信息。

默认情况下,JSP允许会话跟踪,一个新的HttpSession对象将会自动地为新的客户端实例化。禁止会话跟踪需要显式地关掉它,通过将page指令中session属性值设为false来实现,就像下面这样:

<%@ page session="false" %>
复制代码

JSP引擎将隐含的session对象暴露给开发者。由于提供了session对象,开发者就可以方便地存储或检索数据。

下表列出了session对象的一些重要方法:

17、Session与Cookie的对比

18、HttpSession原理

服务器不会马上给你创建session,在第一次获取session时,即reques.getSession()方法执行时,才会创建session。

获取Cookie中的JSESSIONID:

  • 如果sessionID不存在,创建session,把session保存起来,把新创建的sessionID保存到Cookie中;
  • 如果sessionID存在,创建sessionID查找session对象,如果没有查找到,创建session,把session保存起来,把新创建的sessionID保存到Cookie中;
  • 如果sessionID存在,通过sessionID查找到了session对象,那么就不会再创建session对象了;
  • 如果创建新的session,浏览器会得到一个包含了sessionID的Cookie,这个Cookie的生命为-1,即只在浏览器内存中存在,如果不关闭浏览器,那么Cookie就会一直存在;
  • 下次请求时,再执行request.getSession()方法时,因为可以通过Cookie中的sessionID找到session对象,所以与上一次请求使用的是同一个session对象。
  • request.getSession(false):如果Cookie不存在,session也不存在,那么返回NULL,而不会创建session对象;
  • request.getSession(true)/request.getSession():两个方法一样,当session对象不存在时,创建session对象
  • String getId() 获取sessionID;
  • int getMaxInactiveInterval()获取session最大的不活动时间(秒),默认为30分钟,当session在30分钟内没有使用,那么Tomcat就会在session池中移除;
  • void invalidate() 让session失效,调用这个方法会让session失效,当session失效后,客户端再次请求,服务器会给客户端一个新的session;
  • boolean isNew() 查看session是否为新的,判断是新创建的,还是从Cookie获取的;

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK