Java 使用 Servlet进行URL重写
URL重写是一个在加载页面时追加或修改任何URL结构的过程。
客户端发出的请求总是一个新的请求,服务器无法识别当前的请求是由一个新的客户端还是以前的同一个客户端发出的。由于HTTP协议的这种特性,网络服务器被称为无状态。
但很多时候,我们在处理请求时应该知道谁是客户端。例如:
在任何社交网站上,从登录到注销,服务器应该知道谁是客户端,这样服务器就可以根据用户的需要管理所有的请求。
这个问题由Servlet中的Session解决。
会话: 会话是客户和服务器之间的一种状态,它包含客户和服务器之间的多个请求和响应。我们知道HTTP和Web服务器都是无状态的,维护会话的唯一方法是在每次请求和响应中在服务器和客户端之间传递一些关于会话的唯一信息(会话ID)。
以下是一些我们可以在请求和响应中提供唯一ID的方法
- Servlet中的会话接口
- Cookies管理
- URL重写
URL重写
如果你的浏览器不支持cookies,URL重写为你提供了另一种会话跟踪的选择。URL重写是一种方法,其中请求的URL被修改以包括会话ID。有几种方法可以进行URL重写。
这里我们讨论的是会话管理技术,我们将控制权从一个Servlet传递给另一个。将控制权从一个Servlet传递给另一个Servlet的语法如下
// SecondServlet is the name of the servlet where you want to pass control
out.print("<a href='SecondServlet?uname=" + n + "'>visit</a>");
注意: 一般来说,我们为请求调度器编写web.xml文件,但在这个例子中,我们使用注解,所以他们不需要创建web.xml文件。
注释的语法是:
@WebServlet("/ServletName") // at the place of ServletName
we have to write the name of our servlet file and this annotation
should be written at the starting of class in servlet.
使用注解的URL重写进行会话跟踪的例子
<!-- Save this file as Index.html -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="FirstServlet" method="get">
Name:<input type="text" name="userName"/><br/>
<input type="submit" value="submit"/>
</form>
</body>
</html>
// Name this file as FirstServlet.java
package GeeksforGeeks;
import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet("/FirstServlet") // annotation
// this annotation is used for replacing xml file
public class FirstServlet extends HttpServlet {
// class name is FirstServlet which extends HttpServlet
public void doGet(HttpServletRequest request, HttpServletResponse response)
{
try {
response.setContentType("text/html");
/* The response's character encoding is only set
from the given content type if this method
is called before getWriter is called.
This method may be called repeatedly to
change content type and character encoding.*/
PrintWriter out = response.getWriter();
/*T he Java PrintWriter class ( java.io.PrintWriter ) enables you to
write formatted data to an underlying Writer .
For instance, writing int, long and other primitive data
formatted as text, rather than as their byte values*/
String n = request.getParameter("userName");
//request.getParameter takes the value from index.html file
// where name is username
out.print("Welcome " + n);
// out.println is used to print on the client web browser
//url rewriting is used for creating session
// it will redirect you to SecondServlet page
out.print("<a href='SecondServlet?uname=" + n + "'>visit</a>");
out.close();
}
catch (Exception e) {
System.out.println(e);
}
}
}
// Name this file as SecondServlet.java
package GeeksforGeeks;
import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet("/SecondServlet") // annotation
public class SecondServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
{
try {
response.setContentType("text/html");
/*
* The response's character encoding is only set from the given
* content type if this method is called before getWriter is called.
* This method may be called repeatedly to change content type and
* character encoding.
*/
PrintWriter out = response.getWriter();
/*
* The Java PrintWriter class ( java.io.PrintWriter ) enables you to
* write formatted data to an underlying Writer . For instance,
* writing int, long and other primitive data formatted as text,
* rather than as their byte values
*/
// getting value from the query string
String n = request.getParameter("uname");
out.print("Hello " + n);
/* out.println is used to print on the client web browser */
out.close();
}
catch (Exception e) {
System.out.println(e);
}
}
}
程序流程
解释(按图索骥)
当你在eclipse中部署你的项目时,第一个被加载的页面是HTML表单,其表单动作是第一个servlet,所以控件会被送到servlet1。在这种情况下,我们将servlet1命名为FirstServlet,在那里打印用户名。在FirstServlet中,我们提供了url,在那里我们使用url重写将控件转移到servlet2。在我们的案例中,我们将servlet2命名为SecondServlet。
URL重写的优势
- 它不依赖于cookie,无论cookie是启用还是禁用,都可以工作。
- 不是所有的页面都需要额外的表单提交
URL重写的缺点
它只对链接起作用,只能发送文本。