URL重写 (URL Rewriting) 是一种REST的相关技术,它可以在 Web Server 中,针对用户所提供的 URL 进行转换后,再传入 Web Server 中的程序处理器。
URL重写被用来做什么?
总是能用来保持会话,不论客户端是否支持cookies。
URL重写与隐含字段的比较
Example 7-2. Session tracking using URL rewriting
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class ShoppingCartViewerRewrite extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println("<HEAD><TITLE>Current Shopping Cart Items</TITLE></HEAD>"); out.println("<BODY>"); // Get the current session ID, or generate one if necessary String sessionid = req.getPathInfo(); if (sessionid == null) { sessionid = generateSessionId(); } // Cart items are associated with the session ID String[] items = getItemsFromCart(sessionid); // Print the current cart items. out.println("You currently have the following items in your cart:<BR>"); if (items == null) { out.println("<B>None</B>"); } else { out.println("<UL>"); for (int i = 0; i < items.length; i++) { out.println("<LI>" + items[i]); } out.println("</UL>"); } // Ask if the user wants to add more items or check out. // Include the session ID in the action URL. out.println("<FORM ACTION=\"/servlet/ShoppingCart/" + sessionid + "\" METHOD=POST>"); out.println("Would you like to<BR>"); out.println("<INPUT TYPE=submit VALUE=\" Add More Items \">"); out.println("<INPUT TYPE=submit VALUE=\" Check Out \">"); out.println("</FORM>"); // Offer a help page. Include the session ID in the URL. out.println("For help, click <A HREF=\"/servlet/Help/" + sessionid + "?topic=ShoppingCartViewerRewrite\">here</A>"); out.println("</BODY></HTML>"); } private static String generateSessionId() { String uid = new java.rmi.server.UID().toString(); // guaranteed unique return java.net.URLEncoder.encode(uid); // encode any special chars } private static String[] getItemsFromCart(String sessionid) { // Not implemented } }
This servlet first tries to retrieve the current session ID using getPathInfo() . If a session ID is not specified, it callsgenerateSessionId() to generate a new unique session ID using an RMI class designed specifically for this. The session ID is used to fetch and display the current items in the cart. The ID is then added to the form's ACTION attribute, so it can be retrieved by theShoppingCart servlet. The session ID is also added to a new help URL that invokes theHelp servlet. This wasn't possible with hidden form fields because theHelp servlet isn't the target of a form submission.
The advantages and disadvantages of URL rewriting closely match those of hidden form fields. The major difference is that URL rewriting works for all dynamically created documents, such as theHelp servlet, not just forms. Plus, with the right server support, custom URL rewriting can even work for static documents. Unfortunately, actually performing the URL rewriting can be tedious.
隐含字段:
缺点;
安全性折中,
增加网络负担,影响性能
隐含字段限于动态表单
仅限于文本
优点:
普遍存在并支持匿名
客户端技术,独立于服务器,操作简单,保存的数据量比cookies大。
总结:利于分布式会话保持实现。