`

URL与RequestDispatcher

阅读更多
        今天照例继续自己的网站建设之旅,原本以为可以大有进展,结果又是被一个问题弄得很郁闷。通常在一个表单元素(form)中,action属性值定义了接收及处理表单元素的URL,而这个URL是会被显示在IE的地址栏中的。特别的,在WebWork中是由.action去处理用户提交表单,如<form action="register.action" method="post">,那么当用户点击submit按钮提交了表单之后,register.action 也就出现在IE 的地址栏中了,尽管处理业务逻辑的代码会将request分发(dispatch)到新的页面,但是IE的地址栏并没有因此而改变,并没有出现新的页面对应的URL。正是因为这一点,如果用户在register.action执行成功之后,再次刷新页面的话,就会重新发送对register.action的请求。但是这个时候,用户先前注册的动作已经成功了,这样一个新的请求相当于将相同的id重复注册了两次,这样我的程序也就会不留情面的抛出一个“此ID已经被注册”的信息了。说到这个问题,可以分成两个方面去讨论了。一个就是如何将URL进行屏蔽,第二个就是RequestDispatcher本身存在的问题。
        面对这个问题的时候,我能够想到的第一个办法就是将URL屏蔽,也就是说不让.action出现在URL中,用户如果还想执行一次register.action的话就不得不再次回到注册的页面,并且点击submit按钮去实现了。尽管这样做是不可能防止用户直接在地址栏输入URL去执行register.action的,但是,至少防止了误操作。然而这样的想法,我现在还没有找到实现的方式。
        另外的一个方面就是RequestDispatcher本身实现的问题。在xwork.xml文件中的result节点,type的属性通常有以下几种:dispatcher,redirect,velocity,xslt和chain。从文档上可以看到,dispatcher和redirect都是重定位到一个新的URL,其最大的区别在于redirect并不会将form的数据传递至目标URL,而dispatcher则是可以的。其实从WebWork的源码也可以看出,dispatcher类型对应了RequestDispatcher.forward方法,而redirect类型则是HttpServletResponse.sendRedirect方法。事实上,forward方法确实是不会使得其参数中包含的URL在IE地址栏中显示出来的。这样做也是可以理解的,毕竟如果将URL显示出来的话,一旦用户刷新了页面,那么原先dispatch的request也就随之消失了,这也是程序设计者不想看到的。那么有没有两者之间的平衡点呢?这个问题,只能留待你我共思索了。
分享到:
评论

相关推荐

    jsp 动态转静态 URL重写

    一、动态URL与静态URL的区别 1. 动态URL:动态URL通常包含“?”、“=”、"&"等特殊字符,用于传递参数给服务器执行相应的动态脚本,例如:`http://example.com/article.jsp?id=123`。这种方式便于数据库交互,但不...

    Servlet关于RequestDispatcher的原理详解

    RequestDispatcher的主要特点是浏览器上显示的URL是最先请求的目标资源的URL,不会因为使用了forward或include方法而改变。因此forward和include的调用对于用户来说是透明的。 在使用RequestDispatcher时,需要注意...

    jsp的URL重写(内附说明)

    - **使用`RequestDispatcher`:** 在Servlet中接收重写后的URL,然后通过`RequestDispatcher.forward()`或`RequestDispatcher.include()`方法转发到实际处理请求的资源。 - **使用Filter:** 创建一个Filter拦截...

    JavaWeb中URL重写用Forward方式并使其后filter可以拦截内部转发

    这些文件通常用于JavaWeb项目的开发和构建,与上述技术知识点的解释关系不大。在实际开发中,你需要将Filter和Servlet的代码放入`src`目录下的适当包内,然后在`WebContent`下组织相关的HTML、JSP等资源,以实现完整...

    jsp实现URL伪静态.rar

    首先,我们要理解动态URL与静态URL的区别。动态URL通常包含一系列参数,如问号(?)、等号(=)以及多个参数之间用与号(&)分隔,这样的URL结构对于搜索引擎来说不太友好,因为它们可能无法完全解析这些复杂的参数...

    RequestDispatcher

    与转发不同,包含不会改变请求的URL,客户端可以看到原始请求的页面,而包含的资源被嵌入其中。这使得在多个页面间共享一部分内容,如页头、页脚或者侧边栏变得简单。 `RequestDispatcher`可以通过以下几种方式获取...

    用户登录过滤相关页面,过滤URL越权访问

    ### 用户登录过滤与URL越权访问控制 #### 一、概述 在现代Web应用程序中,安全性和用户体验至关重要。为了确保用户数据的安全以及提供一个良好的用户体验环境,开发人员常常需要实现一系列的安全措施。其中,...

    Servlet转发与重定向

    4. 请求与响应的对象:RequestDispatcher.forward 方法的调用者与被调用者之间共享相同的 request 对象和 response 对象,而 HttpServletResponse.sendRedirect 方法调用者与被调用者使用各自的 request 对象和 ...

    java web知识集锦.doc

    ### Java Web知识集锦:RequestDispatcher与sendRedirect的区别详解 #### 概述 在Java Web开发过程中,开发者经常需要处理用户请求的转发和重定向。这两种机制有助于改善用户体验并简化程序逻辑。本文将深入探讨`...

    java struts如何隐藏提交后缀.action, .do.zip

    是指通过将JSP页面映射到Servlet,然后在Servlet中处理逻辑,最后通过`RequestDispatcher.forward()`或`Response.sendRedirect()`方法将控制权转交给JSP页面,这样URL中就不会显示JSP扩展名。 6. **网站根目录的...

    五种JSP页面跳转方法详解

    `&lt;jsp:forward page="" /&gt;` 是一种基于JSP标签的页面跳转方式,它与 `RequestDispatcher.forward()` 类似,都是在服务器内部进行转发,不会改变客户端的URL。 **示例代码**: ```jsp ``` **特点**: - **简洁**: ...

    java web知识集锦2.doc

    ### Java Web知识集锦:RequestDispatcher与sendRedirect的区别详解 #### 概述 在Java Web开发中,控制页面之间的流转是非常重要的技术之一。通常我们有两种常用的方法:`RequestDispatcher`和`sendRedirect`。这...

    JSP中5种跳转的方法

    在Java Server Pages (JSP) 开发中,页面间的跳转是实现用户交互与功能流转的重要环节。本文将详细介绍JSP中五种常用的页面跳转方法,并深入探讨它们的特点及应用场景。 ### 1. RequestDispatcher.forward() #### ...

    请求重定向个请求分派

    * 重定向的访问过程结束后,浏览器地址栏中显示的 URL 会发生改变,由初始的 URL 地址变成重定向的目标 URL;而请求转发过程结束后,浏览器地址栏保持初始的 URL 地址不变。 * 请求分派的发起者和被调用者之间共享...

    jsp跳转详情

    与`RequestDispatcher.forward()`不同,`response.sendRedirect()`会生成一个新的HTTP请求,从而导致浏览器地址栏中的URL发生变化。这种方式通常用于需要更改浏览器地址栏中的URL的场景。 **示例代码:** ```java ...

    JSP页面的五种跳转方法

    在选择跳转方法时,如果只在同一应用内部跳转并且不需要暴露新URL,建议使用RequestDispatcher.forward(),因为它更高效。如果需要跨应用跳转或者希望用户看到新URL,应使用response.sendRedirect()。其他方法如Meta...

    转发与重定向区别

    尽管HttpServletResponse.sendRedirect方法和RequestDispatcher.forward方法都可以让浏览器获得另外一个URL所指向的资源,但两者的内部运行机制有着很大的区别。下面是HttpServletResponse.sendRedirect方法实现的...

    redirect--and-forword.rar_redirect

    重定向对用户可见,浏览器的地址栏会显示新URL,且浏览器发送新的请求到这个URL。 转发(Forward) 转发是服务器内部的请求传递,它不会改变浏览器的URL。在Java Web中,我们通常使用RequestDispatcher对象的...

    JSP中5种跳转foward,request等等的详细区别

    JSP 中有五种跳转方式,包括 RequestDispatcher.forward()、response.sendRedirect()、jsp:forward、RequestDispatcher.include() 和 HttpServletResponse.sendRedirect()。下面我们将详细介绍这五种跳转方式的区别...

    jsp页面的五种跳转方式

    **概念**:`&lt;jsp:forward&gt;` 标签是 JSP 内置的一种转发机制,其功能与 `RequestDispatcher.forward()` 类似,但使用起来更加简单直观。 **实现方式**: ```jsp ``` **特点**: - **语法简洁**:相比 Java 代码...

Global site tag (gtag.js) - Google Analytics