跨域请求

最近项目用到跨域登录请求并跳转,其实实际上用到的就是重定向和转发。
本来的基础知识,现在感觉很陌生,实现了功能,也加深了重定向和转发的理解。

javaweb实现跳转在前端和后端都可以实现。
前端使用window.location=url
后端使用response.senRedirect ,request.getRequestDispatcher().forward()。

重定向

  1. response.senRedirect 属于重定向,不仅可以重定向到当前应用程序中的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。

  2. 重定向访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL

  3. HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求,这个过程好比有个绰号叫“浏览器”的人写信找张三借钱,张三回信说没有钱,让“浏览器”去找李四借,并将李四现在的通信地址告诉给了“浏览器”。于是,“浏览器”又按张三提供通信地址给李四写信借钱,李四收到信后就把钱汇给了“浏览器”。
    由此可见,重定向的时候,“浏览器”一共发出了两封信和收到了两次回复,“浏览器”也知道他借到的钱出自李四之手。

  4. 不共享request对象和response对象。

转发

  1. forward 属于转发方式,只能将请求转发给同一个WEB应用中的组件;
  2. 请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
  3. request.getRequestDispatcher().forward()方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。这个过程好比绰号叫“浏览器”的人写信找张三借钱,张三没有钱,于是张三找李四借了一些钱,甚至还可以加上自己的一些钱,然后再将这些钱汇给了“浏览器”。
  4. 共享相同的request对象和response对象。

以上部分内容引自
https://blog.csdn.net/liubin5620/article/details/79922692 出处

后端跳转不能用Ajax请求。
若在后端跳转,前端不能用Ajax请求,浏览器发送Ajax请求后,一直处于等待界面。
因为ajax做数据请求的,不能做除了获取返回数据以外的其它动作了。所以浏览器端是不会发起重定向的。

JSONObject result = new JSONObject();
JSONObject jsonss = new JSONObject();
jsons.put("key","value");
try {
            URL url = new URL("这里写你需要调用接口的地址");
            //打开和url之间的连接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            PrintWriter out = null;
            //请求方式 这里设置你需要请求的方式
//           conn.setRequestMethod("POST");
//           //设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
//  这里设置请求头
            conn.setRequestProperty("Content-Type", "application/json;charset=utf-8");
            //设置是否向httpUrlConnection输出,设置是否从httpUrlConnection读入,此外发送post请求必须设置这两个
            //最常用的Http请求无非是get和post,get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,
            //post与get的 不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
            conn.setDoOutput(true);
            conn.setDoInput(true);
            //获取URLConnection对象对应的输出流
            out = new PrintWriter(conn.getOutputStream());
            //发送请求参数即数据
            out.print(result);
            //缓冲数据
            out.flush();
            //获取URLConnection对象对应的输入流
            InputStream is = conn.getInputStream();
            //构造一个字符流缓存
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String str = "";
            com.alibaba.fastjson.JSONObject jsonss = null;
            while ((str = br.readLine()) != null) {
                jsonss =com.alibaba.fastjson.JSONObject.parseObject(str);
            }
            System.out.println("获取到的报文数据为:"+jsonss);
            //关闭流
            is.close();
            //断开连接,最好写上,disconnect是在底层tcp socket链接空闲时才切断。如果正在被 
            其他线程使用就不切断。
            //固定多线程的话,如果不disconnect,链接会增多,直到收发不出信息。写上 
            disconnect后正常一些。
            conn.disconnect();
            System.out.println("结束");
        } catch (Exception e) {
            e.printStackTrace();
        }


你可能感兴趣的:(javaweb)