`
greenmoon
  • 浏览: 48612 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

HttpServletRequest.getRequestUri不能获取forward之前的uri解决

 
阅读更多

当调用 RequestDispatcher.forward(javax.servlet.ServletRequest, javax.servlet.ServletResponse)后,再调用javax.servlet.ServletRequest的getRequestUr方法得到的是forward后的uri,之前的uri得不到了。servlet规范明确规定了这种情况:getRequestURI

java.lang.String getRequestURI()
Returns the part of this request's URL from the protocol name up to the query string in the first line of the HTTP request. The web container does not decode this String. For example:
First line of HTTP request	 Returned Value
POST /some/path.html HTTP/1.1		/some/path.html
GET http://foo.bar/a.html HTTP/1.0		/a.html
HEAD /xyz?a=b HTTP/1.1		/xyz
To reconstruct an URL with a scheme and host, use HttpUtils#getRequestURL.

Returns:
a String containing the part of the URL from the protocol name up to the query string
See Also:
HttpUtils#getRequestURL

 getRequestURL

java.lang.StringBuffer getRequestURL()
Reconstructs the URL the client used to make the request. The returned URL contains a protocol, server name, port number, and server path, but it does not include query string parameters.
If this request has been forwarded using RequestDispatcher.forward(javax.servlet.ServletRequest, javax.servlet.ServletResponse), the server path in the reconstructed URL must reflect the path used to obtain the RequestDispatcher, and not the server path specified by the client.

Because this method returns a StringBuffer, not a string, you can modify the URL easily, for example, to append query parameters.

This method is useful for creating redirect messages and for reporting errors.

Returns:
a StringBuffer object containing the reconstructed URL

 

要想使用forward前的uri就需要费一翻脑筋了,好在spring UrlPathHelper提供了解决方案,public String getOriginatingRequestUri(HttpServletRequest request) 可以获取到之前的uri,UrlPathHelper是个好东西,还可以做很多事情。仔细研究一下这个方法:

/**
     * Return the request URI for the given request. If this is a forwarded request,
     * correctly resolves to the request URI of the original request.
     */
    public String getOriginatingRequestUri(HttpServletRequest request) {
        String uri = (String) request.getAttribute(WEBSPHERE_URI_ATTRIBUTE);
        if (uri == null) {
            uri = (String) request.getAttribute(WebUtils.FORWARD_REQUEST_URI_ATTRIBUTE);
            if (uri == null) {
                uri = request.getRequestURI();
            }
        }
        return decodeAndCleanUriString(request, uri);
    }
 

针对websphere和其他的web容器有不同的方式,但是基础方式都是从request的属性中获取forward之前的uri,自从servlet2.4版本之后,request内部其实有一个属性存储了这个值,这个属性的名字是: /**

     * Special WebSphere request attribute, indicating the original request URI.
     * Preferable over the standard Servlet 2.4 forward attribute on WebSphere,
     * simply because we need the very first URI in the request forwarding chain.
     */
    private static final String WEBSPHERE_URI_ATTRIBUTE = "com.ibm.websphere.servlet.uri_non_decoded";

 

/**
   57   	 * Standard Servlet 2.4+ spec request attributes for forward URI and paths.
   58   	 * <p>If forwarded to via a RequestDispatcher, the current resource will see its
   59   	 * own URI and paths. The originating URI and paths are exposed as request attributes.
   60   	 */
   61   	public static final String FORWARD_REQUEST_URI_ATTRIBUTE = "javax.servlet.forward.request_uri";

 

参照代码:

http://www.docjar.com/html/api/org/springframework/web/util/WebUtils.java.html

http://www.docjar.com/html/api/org/springframework/web/util/WebUtils.java.html

 

 

分享到:
评论

相关推荐

    HttpServletRequest详解.docx

    - `getRequestURI()` 提供请求行中的URI部分,即除去协议、主机和端口后的路径。 - `getQueryString()` 返回请求行中的参数部分,即URL后面的问号(?)后面的部分,通常包含键值对。 - `getRemoteHost()` 返回...

    HttpServletRequest对象

    - `getRequestURI()`:获取请求的统一资源标识符(URI)中资源名称的部分,不包括查询字符串。 - `getQueryString()`:返回请求URI后的查询参数部分,通常以问号(?)分隔。 - `getProtocol()`:返回请求使用的...

    李君老师JavaEE笔记-自定以MVC框架

    - **请求处理**:首先获取当前请求的URI,然后通过字符串分割来解析出处理器的类名和方法名。 - **反射调用**:使用Java的反射API,根据类名和方法名动态地调用处理器方法,传递HttpServletRequest和...

    基于HttpServletRequest 相关常用方法的应用

    - `request.getRequestURI()`:获取请求的URI(不包含上下文路径)。 - `request.getContextPath()`:获取Servlet应用的上下文路径。 - `request.getMethod()`:获取请求的方法,通常是GET或POST。 - `request....

    SpringMVC-Mybatis-Shiro-redis-master 权限集成缓存中实例

    在&lt;build&gt; 标签内加入即可,如果还是不能解决,那么请你加群(改名后)说明你的问题,有人会回答你。 5.Tomcat7以上在访问JSP页面的时候,提示JSTL错误。 这个错误是因为Tomcat7 中没有 JSTL 的jar包,现在已经在...

    request域对象的实例代码

    4. **获取请求URI和路径**:使用`getRequestURI()`和`getContextPath()`可以获取请求的完整URI和应用上下文路径。 5. **获取请求的属性和参数**:`setAttribute()`和`getAttribute()`方法用于在Request对象中设置和...

    Web前端 Request&Response

    - `request.getRequestURI()`:获取请求的资源URI,不包括主机名和端口号。 - `request.getQueryString()`:获取URL后面的查询字符串。 - `request.getHeader(String name)`:获取指定请求头的值。 - `request....

    reqresp_demo4.zip

    4. 获取请求URI和路径信息:`getRequestURI()`返回完整的请求URI,`getPathInfo()`则返回请求URL路径的剩余部分。 HttpServletResponse接口则是用于构建和发送HTTP响应的。它的主要职责有: 1. 设置响应状态码:如`...

    reqresp_demo1.zip

    2. 获取请求URL:`getRequestURI()`返回请求的统一资源标识符(URI),不包括主机名和端口号。 3. 获取请求参数:`getParameter(String name)`返回指定参数的值,`getParameterNames()`返回所有参数名的枚举,`...

    servlet2.4doc

    forward(ServletRequest, ServletResponse) - Method in interface javax.servlet.RequestDispatcher Forwards a request from a servlet to another resource (servlet, JSP file, or HTML file) on the server. ...

    JAVA servlet API说明文档

    13. getRequestURI():返回请求的URI。 14. getServletPath():返回请求的Servlet路径。 15. getSession():获取或创建一个与请求关联的会话。 16. isRequestedSessionIdValid():判断请求中包含的会话ID是否有效。 ...

    Ajax请求和Filter配合案例解析

    String request_uri = req.getRequestURI(); chain.doFilter(request, response); } } // 校验方法 protected static boolean sqlValidate(String str) { str = str.toLowerCase(); // 统一转为小写 // ...

    Spring Controller拦截器配置

    String url = requestUri.substring(request.getContextPath().length()); if (null == request.getSession().getAttribute(Constants.SESSION_USERINFO_ENTITY)) { request.getRequestDispatcher("/web/login....

    JSP的Request对象练习源代码

    5. **获取请求URI和路径**:`getRequestURI()`返回请求的统一资源标识符,而`getContextPath()`则提供应用的上下文路径,`getServletPath()`则是请求的Servlet路径。 6. **读取请求体内容**:对于POST请求,如果...

    Java WEB实现URL重写

    HttpServletRequest req = (HttpServletRequest) request; String originalUrl = req.getRequestURI(); // 这里进行URL重写逻辑 String rewrittenUrl = rewrite(originalUrl); // 设置新的请求URI req....

    JavaWeb 视频教程 传智播客 第10天 共28天

    4. **获取请求URI和路径**:`getRequestURI()`和`getContextPath()`帮助我们了解请求的具体路径和上下文路径,这对于构建动态路由和处理URL重写很有帮助。 HttpServletResponse接口则负责将服务器的响应回送给...

    java 的面试试题

    - **getRequestURI()**:获取请求的统一资源标识符(URI)。 - **getRemoteAddr()**:获取客户端的IP地址。 - **getRemoteHost()**:获取客户端的主机名。 - **getSession()**:获取与当前请求关联的HttpSession对象...

    Struts1之url截取_动力节点Java学院整理

    最后,为了更深入理解Struts1中URL截取的实现机制,开发者需要对Java Servlet API有一定了解,并且掌握Struts1框架的基本原理和组件,如Action, ActionForm, ActionMapping, ActionForward等。只有这样,才能有效地...

    java 面试题 总结

    声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其...

Global site tag (gtag.js) - Google Analytics