美文网首页
Servlet5 - request

Servlet5 - request

作者: 老茂在北京 | 来源:发表于2017-04-08 15:39 被阅读19次

    HttpServletRequest对象代表客户端的请求


    HTTP协议之请求 继承关系

    通过Request对象进行的常用操作

    • 获取客户机信息
    • 获取请求头信息
    • 获取请求参数
    • 利用请求域传递对象(request域对象)
    • 重定向和转发的区别
    获取客户机信息
    获取客户机信息

    获取请求头信息

    获取请求头信息
    • referer 网页来源
    • user-agent 浏览器类型
      • MSIE IE浏览器
      • Firefox 火狐浏览器
      • Chrome google浏览器
    /**
     * 获取客户机的内容 和请求头内容
     * @author limaoquan
     *
     */
    public class RequestServlet1 extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //获取IP
            String ip = request.getRemoteAddr();
            String method = request.getMethod();
            String path = request.getContextPath();
            
            System.out.println("IP地址" + ip);
            System.out.println("虚拟路径是 "+ path);
            System.out.println("请求方式"+ method);
            
            //获取请求头
            String referer=request.getHeader("referer");//网页来源(防盗链)
            String agent = request.getHeader("user-agent");//判断浏览器(文件下载)
            //遍历所有请求头
            Enumeration<String> names = request.getHeaderNames();
            while(names.hasMoreElements()){
                String name = names.nextElement();
                System.out.println(name + ":" + request.getHeader(name));
            }
            System.out.println("------------");
            System.out.println("您使用浏览器:"+ request.getHeader("user-agent"));
            
            //判断referer是否存在和有效
            if(referer!=null&&referer.startsWith("http://localhost/day")){
                //不属于盗链
                response.setContentType("text/html;charset=utf-8");
                response.getWriter().println("机密信息");
            }else{
                //盗链
                response.setContentType("text/html;charset=utf-8");
                response.getWriter().println("您的请求盗链");
            }
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }
    }
    

    获取请求参数(重要)

    获取请求参数
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    
    <form action="/day10/reg" method="post">
            <table border="1" width="50%">
                <tr>
                    <td>输入姓名</td>
                    <td><input type="text" name="username"></td>
                </tr>
                <tr>
                    <td>输入密码</td>
                    <td><input type="password" name="password"></td>
                </tr>
                <tr>
                    <td>选择性别</td>
                    <td>
                        <input type="radio" name="sex" value="man"/>男
                        <input type="radio" name="sex" value="woman"/>女
                    </td>
                </tr>
                <tr>
                    <td>选择爱好</td>
                    <td>
                        <input type="checkbox" name="love" value="lq"/>篮球
                        <input type="checkbox" name="love" value="zq"/>足球
                        <input type="checkbox" name="love" value="pq"/>排球
                    </td>
                </tr>
                <tr>
                    <td>选择城市</td>
                    <td>
                        <select name="city">
                            <option value="none">--请选择--</option>
                            <option value="bj">北京</option>
                            <option value="sh">上海</option>
                            <option value="sz">深圳</option>
                        </select>
                    </td>
                </tr>
                <tr>        
                    <td colspan="2"><input type="submit" value="提交"></td>
                </tr>
            </table>
        </form>
    
    </body>
    </html>
    
    html界面
    public class RegServlet extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            /**
             * request获取中文的乱码
             *  post请求
             *      setCharacterEncoding(String env) 设置request缓冲区编码
             *  
             *  get请求
             *      
             */
            //设置request缓冲区编码
            request.setCharacterEncoding("UTF-8");
            //获取内容,做其他操作
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            String sex = request.getParameter("sex");
            
            //获取爱好,有过个值
            String[] loves = request.getParameterValues("love");
            String city = request.getParameter("city");
            
            System.out.println("用户名:" + username);
            System.out.println("密码:" + password);
            System.out.println("性别:" + sex);
            System.out.println("爱好:" + Arrays.toString(loves));
            System.out.println("城市:" + city);
            System.out.println("==========================");
            //获取map集合
            Map<String,String[]> map = request.getParameterMap();
            //循环遍历
            Set<String> keys = map.keySet();
            for(String key:keys){
                String[] values = map.get(key);
                System.out.println(Arrays.toString(values));
            }
            
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }
    }
    
    乱码问题解决
    • POST请求乱码 :
      request.setCharacterEncoding("utf-8");
    • GET请求乱码
    • 解决方案一:修改server.xml (尽力不要用方案一)
      <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="utf-8"/>
      必须有修改tomcat服务器配置文件权限

    • 解决方案二:逆向编解码(推荐用)
      username = URLEncoder.encode(username, "ISO8859-1");
      username = URLDecoder.decode(username, "utf-8");
      简化
      username = new String(username.getBytes("ISO8859-1"),"utf-8");

    重定向和转发

    域对象 ServletContext 与 request 的区别:

    • ServletContext: 服务器启动,为每个web应用只创建一个ServletContext对象,所有应用共享
    • request 只有一次请求的范围

    两者方法相似:

    • setAttribute();
    • getAttribute();
    • removeAttribute();
    public class RequestServlet2 extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //request域设置内容
            request.setAttribute("name", "Mango");
            
            //转发(路径服务器端的绝对路径) 转发可以共享request域
            request.getRequestDispatcher("/request3").forward(request, response);
            
            //完成重定向(客户端路径) 重定向无法共享request域
            //response.sendRedirect("/day10/request3");
                    
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }
    }
    
    
    
    
    public class RequestServlet3 extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //获取
            String value = (String)request.getAttribute("name");
            
            response.setContentType("text/html;charset=UTF-8");
            response.getWriter().write("访问到 了 3 " + value);
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }
    
    }
    
    转发和重定向的区别

    转发

      RequestDispatcher rd = request.getRequestDispatcher("/request3");
      rd.forward(request, response);
    

    相关文章

      网友评论

          本文标题:Servlet5 - request

          本文链接:https://www.haomeiwen.com/subject/grylattx.html