使用Java Servlet 重写 URL
Url 重写是在加载页面时附加或修改任何 url 结构的过程。
客户端发出的请求始终是一个新请求,服务器无法识别当前请求是由新客户端发送的,还是由以前的同一客户端发送的。由于 HTTP 协议的这一特性,Web 服务器被称为无状态。但是很多时候我们应该知道处理请求的客户是谁。
例如:
在登录到注销期间的任何社交网站中,服务器应该知道谁是客户端,以便服务器可以根据用户需要管理所有请求。
Servlet 中的 Session 解决了这个问题。
会话:会话是客户端和服务器之间的一种状态,它包含客户端和服务器之间的多个请求和响应。正如我们所知,HTTP 和 Web 服务器都是无状态的,维护会话的唯一方法是在每个请求和响应中在服务器和客户端之间传递有关会话的一些唯一信息(会话 id)。
以下是我们可以在请求和响应中提供唯一 ID 的一些方法:
网址重写
如果您的浏览器不支持 cookie,则 URL 重写为您提供了另一种会话跟踪替代方案。 URL 重写是一种将请求的 URL 修改为包含会话 ID 的方法。有几种方法可以执行 URL 重写。
在这里,我们将讨论会话管理技术,其中我们将控制权从一个 servlet 传递到另一个。将控制从一个 servlet 传递到另一个的语法如下
// SecondServlet is the name of the servlet where you want to pass control
out.print("visit");
注意:通常我们为请求调度程序编写 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 重写的会话跟踪示例
Insert title here
// 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("visit");
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重写的缺点
它只适用于链接广告只能发送文本