Servlet规范系列 之 HttpServletRequest源码分析

欢迎大家关注本博,同时欢迎大家评论交流,可以给个赞哦!!!

  HttpServletRequest是在ServletRequest基础上做的进一步封装,使得其更适用于基于HTTP的服务特性,在原有的ServletRequest API基础上增加了处理HTTP的操作。Servlet容器开发厂商会依据HttpServletRequest API进行具体实现,闲言少叙,接下来让我们看下源码。

  HttpServletRequest

package javax.servlet.http;

import javax.servlet.ServletRequest;
import java.util.Enumeration;

/**
 * 继承自javax.servlet.ServletRequest.
 * 专门为HTTP Servlet提供的请求封装类.
 * 由容器创建并传递给Servlet的sevice类.
 */
public interface HttpServletRequest extends ServletRequest {
    
    

    /**
     * 基于BASIC认证.
     */
    public static final String BASIC_AUTH = "BASIC";
    
    /**
     * 基于FORM认证.
     */
    public static final String FORM_AUTH = "FORM";
    
    /**
     * 基于CLIENT_CERT认证.
     */
    public static final String CLIENT_CERT_AUTH = "CLIENT_CERT";
    
    /**
     * 基于DIGEST认证.
     */
    public static final String DIGEST_AUTH = "DIGEST";

    /**
     * 返回认证类型.
     * 所有Servlet容器都支持basic、form、client_cert,digest不一定支持.
     * 若不支持,则返回null.
     */
    public String getAuthType();
    
    /**
     * 获取请求中带有的Cookie信息.
     */
    public Cookie[] getCookies();
    
    /**
     * 以长整数形式返回一个特定的请求头,该长整数代表一个Date对象. 
     * 该方法可以用在包含时间信息的header中,如:If-Modified-Since.
     * @param name 头名称.
     * @return 头值.
     */
    public long getDateHeader(String name);
    
    /**
     * 根据指定的头名称获取头的值.
     * 若存在多个,则返回第一个.
     * @param name 头名称.
     * @return 头值.
     */
    public String getHeader(String name); 

    /**
     * 根据指定的头名称获取头值的枚举.
     * 若没有找到,则返回空的枚举.
     * @param name 头名称.
     * @return 头值.
     */
    public Enumeration getHeaders(String name); 
    
    /**
     * 获取所有的头的枚举.
     * @return 头的枚举.
     */
    public Enumeration getHeaderNames();

    /**
     * 根据指定头名称获取int类型的值.若未找到则返回-1,如不是int类型,则会抛出NumberFormatException异常.
     * @param name 头名称.
     * @return 头值.
     */
    public int getIntHeader(String name);
    
    /**
     * 获取HTTP方法,如:GET、POST、PUT等.
     * @return 方法名.
     */
    public String getMethod();
    
    /**
     * 官网解释:
     *  返回与客户端发出此请求时发送的URL相关联的任何额外路径信息.
     *  额外的路径信息跟随servlet路径,但位于查询字符串之前,并以"/"字符开头.
     * 例如:url-pattern配置为/demo/*,请求URL为http://localhost/Pro/demo/htm/index.html,则pathInfo为/htm/index.html.
     * @return
     */
    public String getPathInfo();

    /**
     * 返回servlet名称之后、
     *      查询字符串之前的任何额外路径信息,并将其转换为实际路径. 
     *      与转换的CGI变量PATH U的值相同
     * @return
     */
    public String getPathTranslated();

    /**
     * 返回项目根路径.
     * 例如:url-pattern配置为/demo/*,请求URL为http://localhost/Pro/demo/htm/index.html,则contextPath为/demo.
     * @return 项目根路径.
     */
    public String getContextPath();

    /**
     * 获得请求中的查询字符串,例如a=1&b=2这样的格式.
     * @return 查询字符串.
     */
    public String getQueryString();
    
    /**
     * 如果用户已经过验证,则返回发出此请求的用户的登录信息,如果用户未经过验证,则返回 null.
     * 用户名是否随每个后续请求发送取决于浏览器和验证类型,返回的值与 CGI变量REMOTE_USER的值相同.
     * @return 用户信息.
     */
    public String getRemoteUser();
    
    /**
     * 返回一个 boolean值,指示指定的逻辑"角色"中是否包含经过验证的用户.
     * 角色和角色成员关系可使用部署描述符定义.
     * 如果用户没有经过验证,则该方法返回 false.
     * @param role 角色.
     * @return 已验证用户是否属于某种角色.
     */
    public boolean isUserInRole(String role);
    
    /**
     * 返回包含当前已经过验证的用户的名称的 java.security.Principal对象.
     * 如果用户没有经过验证,则该方法返回 null.
     * @return java.security.Principal或null.
     */
    public java.security.Principal getUserPrincipal();

    /**
     * 获取请求对应的sessionId.
     * @return sessionId.会话ID.
     */
    public String getRequestedSessionId();
    
    /**
     * 请求URL的相对地址,包括服务器路径,不包括查询参数.
     * @return 请求URL的相对地址.
     */
    public String getRequestURI();
    
    /**
     * 请求的URL地址,包含协议、主机名、端口和服务器路径,但是不包括查询参数.
     * @return 请求URL地址.
     */
    public StringBuffer getRequestURL();
    
    /**
     * 官方解释:
     *  返回此请求的URL中调用servlet的部分.
     *  此路径以"/"字符开头,包含servlet名称或到servlet的路径,但不包含任何额外的路径信息或查询字符串.
     *  与CGI变量SCRIPT_NAME的值相同.
     * 其实真是的意思就是,在配置webx.xml或编程式配置时,配置了url-pattern,请求的URL与url-pattern的有效部分重合部分就是servletPath,
     * 也可以理解为url-pattern的有效部分就是servletPath.
     * 例如:url-pattern配置为/demo/*,请求URL为http://localhost/Pro/demo/htm/index.html,则servletPath为/demo.
     * @return
     */
    public String getServletPath();

    /**
     * 获得请求对应的当前sesson.
     * 在没有session的情况下:
     *  若create=true,则新创建一个session.
     *  若create=false,则不创建session,返回null.
     * @param create session失效的情况下,是否创建session.
     * @return HttpSession实例.
     */
    public HttpSession getSession(boolean create);
    
    /**
     * 获得请求对应的当前sesson.
     * 若没有session,则创建一个session.
     * @return HttpSession实例.
     */
    public HttpSession getSession();

    /**
     * 返回session是否有效.
     * @return session是否有效.
     */
    public boolean isRequestedSessionIdValid();

    /**
     * sessionId是否从Cookie中获得.
     * @return 若是从Cookie中获得,返回true,否则返回false.
     */
    public boolean isRequestedSessionIdFromCookie();

    /**
     * sessionId是否从URL中获得.
     * @return 若是从URL中获得,返回true,否则返回false.
     */
    public boolean isRequestedSessionIdFromURL();
    
    /**
     * @deprecated
     * sessionId是否从URL中获得.
     * @return 若是从URL中获得,返回true,否则返回false.
     */
    public boolean isRequestedSessionIdFromUrl();
    
}

  若文中存在错误和不足,欢迎指正!

本博微信公众号“超哥说码”,欢迎大家订阅,公众号正在完善中,会及时将更优质的博文推送于您!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/securitit/article/details/108046102
今日推荐