• Servlet--HttpServletRequest接口,HttpServletResponse接口


    • HttpServletRequest接口
    定义
    public interface HttpServletRequest extends ServletRequest;

    用来处理一个对 Servlet 的 HTTP 格式的请求信息。


    方法
    1、getAuthType
    public String getAuthType();
    返回这个请求的身份验证模式。
    2、getCookies
    public Cookie[] getCookies();
    返回一个数组, 该数组包含这个请求中当前的所有 cookie。 如果这个请求中没有 cookie ,返回一个空数组。
    3、getDateHeader
    public long getDateHeader(String name);
    返回指定的请求头域的值,这个值被转换成一个反映自 1970-1-1 日(GMT)以来的精确到毫秒的长整数。如果头域不能转换,抛出一个 IllegalArgumentException。如果这个请求头域不存在,这个方法返回-1。
    4、getHeader
    public String getHeader(String name);
    返回一个请求头域的值。 (注意:与上一个方法不同的是,该方法返回一个字符串)如果这个请求头域不存在,这个方法返回-1。
    5、getHeaderNames
    public Enumeration getHeaderNames();
    该方法返回一个 String 对象的列表,该列表反映请求的所有头域名。有的引擎可能不允许通过这种方法访问头域, 在这种情况下, 这个方法返回一个空的列表。
    6、getIntHeader
    public int getIntHeader(String name);
    返回指定的请求头域的值,这个值被转换成一个整数。如果头域不能转换,抛出一个 IllegalArgumentException。如果这个请求头域不存在,这个方法返回-1。
    7、getMethod
    public String getMethod();
    返回这个请求使用的 HTTP 方法(例如:GET、POST、PUT)
    8、getPathInfo
    public String getPathInfo();
    这个方法返回在这个请求的 URL 的 Servlet 路径之后的请求 URL 的额外的路径信息。如果这个请求 URL 包括一个查询字符串, 在返回值内将不包括这个 查询字符串。 这个路径在返回之前必须经过 URL 解码。 如果在这个请求的 URL 的 Servlet 路径之后没有路径信息 。这个方法返回空值。
    9、getPathTranslated
    public String getPathTranslated();
    这个方法获得这个请求的 URL 的 Servlet 路径之后的额外的路径信息, 并将它转换成一个真实的路径。在进行转换前,这个请求的 URL 必须经过 URL 解码。如果在这个 URL 的Servlet 路径之后没有附加路径信息。这个方法返回空值。
    10、getQueryString
    public String getQueryString();
    返回这个请求 URL 所包含的查询字符串。一个查询字串符在一个 URL 中由一个“?”引出。如果没有查询字符串,这个方法返回空值。
    11、getRemoteUser
    public String getRemoteUser
    返回作了请求的用户名,这个信息用来作 HTTP 用户论证。如果在请求中没有用户名信息,这个方法返回空值。
    12、getRequestedSessionId
    public String getRequestedSessionId();
    返回这个请求相应的 session id。如果由于某种原因客户端提供的 session id 是无效的,这个 session id 将与在当前 session 中的 session id 不同,与此同时,将建立一个新的 session 。如果这个请求没与一个 session 关联,这个方法返回空值。
    13、getRequestURI
    public String getRequestURI();
    从 HTTP 请求的第一行返回请求的 URL 中定义被请求的资源的部分。如果有一个查询字符 串存在 ,这个 查询字 符串将 不包括 在返回 值当中 。例如 ,一个 请求通过/catalog/books?id=1 这样的 URL 路径访问,这个方法将返回/catalog/books。这个方法的返回值包括了 Servlet 路径 和路径信息。如果这个 URL 路径中的的一部分经过了 URL 编码, 这个方法的返回值在返回之前必须经过解码。
    14、getServletPath
    public String getServletPath();
    这个方法返回请求 URL 反映调用 Servlet 的部分。例如,一个 Servlet 被映射到/catalog/summer 这个 URL 路径,而一个请求使用 了/catalog/summer/casual 这样的路径。所谓的反映调用 Servlet 的部分就是指/catalog/summer。如果这个 Servlet 不是通过路径匹配来调用。这个方法将返回一个空值。
    15、getSession
    public HttpSession getSession();
    public HttpSession getSession(boolean create);
    返回与这个请求关联的当前的有效的 session。如果调用这个方法时没带参数,那么在没有 session 与这个请求关联的情况下,将会新建一个 session。如果调用这个方法时带入了一个布尔型的参数,只有当这个参数为真时,session 才会被建立。为了确保 session 能够被完全维持。Servlet 开发者必须在响应被提交之前调用该方法。如果带入的参数为假,而且没有 session 与这个请求关联。这个方法会返回空值。
    16、isRequestedSessionIdValid
    public boolean isRequestedSessionIdValid();
    这个方法检查与此请求关联的 session 当前是不是有效。如果当前请求中使用的 session无效,它将不能通过 getSession 方法返回。
    17、isRequestedSessionIdFromCookie
    public boolean isRequestedSessionIdFromCookie();
    如果这个请求的 session id 是通过客户端的一个 cookie 提供的,该方法返回真,否则返回假。
    18、isRequestedSessionIdFromURL
    public boolean isRequestedSessionIdFromURL();
    如果这个请求的 session id 是通过客户端的 URL 的一部分提供的,该方法返回真,否则返回假。请注意此方法与isRequestedSessionIdFromUrl 在 URL 的拼写上不同。
    以下方法将被取消。
    19、isRequestedSessionIdFromUrl
    public boolean isRequestedSessionIdFromUrl();
    该方法被 isRequestedSessionIdFromURL 代替。

    • HttpServletResponse 类
    定义
    public interface HttpServletResponse extends ServletResponse
    描述一个返回到客户端的 HTTP 回应。这个接口允许 Servlet 程序员利用 HTTP 协议规定的头信息。
    成员变量
    public static final int SC_CONTINUE = 100;
    public static final int SC_SWITCHING_PROTOCOLS= 101;
    public static final int SC_OK = 200;
    public static final int SC_CREATED = 201;
    public static final int SC_ACCEPTED = 202;
    public static final int SC_NON_AUTHORITATIVE_INFORMATION= 203;
    public static final int SC_NO_CONTENT = 204;
    public static final int SC_RESET_CONTENT = 205;
    public static final int SC_PARTIAL_CONTENT= 206;
    public static final int SC_MULTIPLE_CHOICES = 300;
    public static final int SC_MOVED_PERMANENTLY = 301;
    public static final int SC_MOVED_TEMPORARILY= 302;
    public static final int SC_SEE_OTHER = 303;
    public static final int SC_NOT_MODIFIED = 304;
    public static final int SC_USE_PROXY = 305;
    public static final int SC_BAD_REQUEST = 400;
    public static final int SC_UNAUTHORIZED = 401;
    public static final int SC_PAYMENT_REQUIRED= 402;
    public static final int SC_FORBIDDEN = 403;
    public static final int SC_NOT_FOUND = 404;
    public static final int SC_METHOD_NOT_ALLOWED = 405;
    public static final int SC_NOT_ACCEPTABLE = 406;
    public static final int SC_PROXY_AUTHENTICATION_REQUIRED= 407;
    public static final int SC_REQUEST_TIMEOUT= 408;
    public static final int SC_CONFLICT = 409;
    public static final int SC_GONE = 410;
    public static final int SC_LENGTH_REQUIRED= 411;
    public static final int SC_PRECONDITION_FAILED = 412;
    public static final int SC_REQUEST_ENTITY_TOO_LARGE= 413;
    public static final int SC_REQUEST_URI_TOO_LONG= 414;
    public static final int SC_UNSUPPORTED_MEDIA_TYPE= 415;
    public static final int SC_INTERNAL_SERVER_ERROR= 500;
    public static final int SC_NOT_IMPLEMENTED = 501;
    public static final int SC_BAD_GATEWAY = 502;
    public static final int SC_SERVICE_UNAVAILABLE = 503;
    public static final int SC_GATEWAY_TIMEOUT = 504;
    public static final int SC_HTTP_VERSION_NOT_SUPPORTED= 505;
    以上 HTTP 产状态码是由 HTTP/1.1 定义的。
    方法
    1、addCookie
    public void addCookie(Cookiecookie);
    在响应中增加一个指定的 cookie。可多次调用该方法以定义多个 cookie。为了设置适当的头域,该方法应该在响应被提交之前调用。
    2、containsHeader
    public boolean containsHeader(String name);
    检查是否设置了指定的响应头。
    3、encodeRedirectURL
    public String encodeRedirectURL(String url);
    对sendRedirect方法使用的指定URL进行编码。 如果不需要编码, 就直接返回这个URL 。之所以提供这个附加的编码方法,是因为在 redirect 的情况下,决定是否对 URL 进行编码的规则和一般情况有所不同。所给的 URL 必须是一个绝对 URL。相对 URL 不能被接收,会抛出一个 IllegalArgumentException。所有提供给 sendRedirect 方法的 URL 都应通过这个方法运行,这样才能确保会话跟踪能够在所有浏览器中正常运行。
    4、encodeURL
    public String encodeURL(String url);
    对包含 session ID 的 URL 进行编码。如果不需要编码,就直接返回这个 URL。Servlet引擎必须提供 URL 编码方法,因为在有些情况下,我 们将不得不重写 URL,例如,在响应对应的请求中包含一个有效的 session,但是这个 session 不能被非 URL 的(例如 cookie )的手段来维 持。所有提供给 Servlet 的 URL 都应通过这个方法运行, 这样才能确保会话跟踪能够在所有
    浏览器中正常运行。
    5、sendError
    public void sendError(int statusCode) throws IOException;
    public void sendError(int statusCode, String message) throws
    IOException;
    用给定的状态码发给客户端一个错误响应。如果提供了一个 message 参数,这将作为响应体的一部分被发出,否则,服务器会返回错误代码所对应的标准信息。调用这个方法后,响应立即被提交。在调用这个方法后,Servlet 不会再有更多的输出 。
    6、sendRedirect
    public void sendRedirect(String location) throws IOException;

    使用给定的路径,给客户端发出一个临时转向的响应(SC_MOVED_TEMPORARILY )。给 定 的 路 径 必 须 是 绝 对 URL 。 相 对 URL 将 不 能 被 接 收 , 会 抛 出 一 个IllegalArgumentException。这个方法必须在响应被提交之前调用。调用这个方法后,响应立即被提交。在调用这个方法后,Servlet 不会再有更多的输出。


    这个方法很有必要说一下,注意了这里接口里面说明的是:一定要是绝对路径。

    但是在实际开发中,我们既可以写相对路径,也可以写绝对路径,这是为什么呢?

    打开tomcat里面response的源码一看就明白了:

    public void sendRedirect(String location) 
            throws IOException {
    
            if (isCommitted())
                throw new IllegalStateException
                    (sm.getString("coyoteResponse.sendRedirect.ise"));
    
            // Ignore any call from an included servlet
            if (included)
                return; 
    
            // Clear any data content that has been buffered
            resetBuffer();
    
            // Generate a temporary redirect to the specified location
            try {
                String absolute = toAbsolute(location);
                setStatus(SC_FOUND);
                setHeader("Location", absolute);
            } catch (IllegalArgumentException e) {
                setStatus(SC_NOT_FOUND);
            }
    
            // Cause the response to be finished (from the application perspective)
            setSuspended(true);
    
        }

     /**
         * Convert (if necessary) and return the absolute URL that represents the
         * resource referenced by this possibly relative URL.  If this URL is
         * already absolute, return it unchanged.
         *
         * @param location URL to be (possibly) converted and then returned
         *
         * @exception IllegalArgumentException if a MalformedURLException is
         *  thrown when converting the relative URL to an absolute one
         */
        private String toAbsolute(String location) {
    
            if (location == null)
                return (location);
    
            boolean leadingSlash = location.startsWith("/");
    
            if (leadingSlash || !hasScheme(location)) {
    
                redirectURLCC.recycle();
    
                String scheme = request.getScheme();
                String name = request.getServerName();
                int port = request.getServerPort();
    
                try {
                    redirectURLCC.append(scheme, 0, scheme.length());
                    redirectURLCC.append("://", 0, 3);
                    redirectURLCC.append(name, 0, name.length());
                    if ((scheme.equals("http") && port != 80)
                        || (scheme.equals("https") && port != 443)) {
                        redirectURLCC.append(':');
                        String portS = port + "";
                        redirectURLCC.append(portS, 0, portS.length());
                    }
                    if (!leadingSlash) {
                        String relativePath = request.getDecodedRequestURI();
                        int pos = relativePath.lastIndexOf('/');
                        relativePath = relativePath.substring(0, pos);
                        
                        String encodedURI = null;
                        final String frelativePath = relativePath;
                        if (SecurityUtil.isPackageProtectionEnabled() ){
                            try{
                                encodedURI = (String)AccessController.doPrivileged( 
                                    new PrivilegedExceptionAction(){                                
                                        public Object run() throws IOException{
                                            return urlEncoder.encodeURL(frelativePath);
                                        }
                               });   
                            } catch (PrivilegedActionException pae){
                                IllegalArgumentException iae =
                                    new IllegalArgumentException(location);
                                iae.initCause(pae.getException());
                                throw iae;
                            }
                        } else {
                            encodedURI = urlEncoder.encodeURL(relativePath);
                        }
                        redirectURLCC.append(encodedURI, 0, encodedURI.length());
                        redirectURLCC.append('/');
                    }
                    redirectURLCC.append(location, 0, location.length());
                } catch (IOException e) {
                    IllegalArgumentException iae =
                        new IllegalArgumentException(location);
                    iae.initCause(e);
                    throw iae;
                }
    
                return redirectURLCC.toString();
    
            } else {
    
                return (location);
    
            }
    
        }

    7、setDateHeader

    public void setDateHeader(String name, long date);
    用一个给定的名称和日期值设置响应头,这里的日期值应该是反映自 1970-1-1 日(GMT)以来的精确到毫秒的长整数。如果响应头已经被设置,新的值将覆盖当前的值。
    8、setHeader
    public void setHeader(String name, String value);
    用一个给定的名称和域设置响应头。如果响应头已经被设置,新的值将覆盖当前的值。
    9、setIntHeader
    public void setIntHeader(String name, int value);
    用一个给定的名称和整形值设置响应头。 如果响应头已经被设置, 新的值将覆盖当前的值。
    10、setStatus
    public void setStatus(int statusCode);
    这个方法设置了响应的状态码,如果状态码已经被设置,新的值将覆盖当前的值。以下的几个方法将被取消
    11、encodeRedirectUrl
    public String encodeRedirectUrl(String url);
    该方法被 encodeRedirectURL取代。
    12、encodeUrl
    public String encodeUrl(String url);
    该方法被 encodeURL 取代。
    13、setStatus
    public void setStatus(int statusCode, String message);
    这个方法设置了响应的状态码,如果状态码已经被设置,新的值将覆盖当前的值。如果提供了一个 message,它也将会被作为响应体的一部分被发送。
  • 相关阅读:
    三级指针
    外挂指针
    内存四区(1)(转载)
    内存四区(3)(转载)
    劫持(1)
    过滤劫持和函数回调(2)
    劫持程序(3)
    dll注入实现MFC程序劫持(4)
    virtual hust 2013.6.20 数论基础题目 I
    virtual hust 2013.6.20 数论基础题目 D
  • 原文地址:https://www.cnblogs.com/LinkinPark/p/5233019.html
Copyright © 2020-2023  润新知