精华内容
下载资源
问答
  • request转发: //转发到index.jsp页面 request.getRequestDispatcher("index.jsp").forward(request, response); response重定向: // 页面重定向 response.sendRedirect(request....

    request转发:

            //转发到index.jsp页面
    		request.getRequestDispatcher("index.jsp").forward(request, response);

    response重定向:

    // 页面重定向
    			response.sendRedirect(request.getContextPath() + "/registSuccess.jsp");

    将json数据输出到页面 :

            //json输出到客户端
    		response.setCharacterEncoding("utf-8");
    		response.getWriter().write(new ObjectMapper().writeValueAsString(result));

     

    展开全文
  • feign使用RequestInterceptor拦截器实现request转发(包括处理特殊字符) 最近项目中需要用到feign还要能实现转发,在网上找了很多基本都是一个模板。 ...

    feign使用RequestInterceptor拦截器实现request转发(包括处理特殊字符)

    最近项目中需要用到feign还要能实现转发,在网上找了很多基本都是一个模板。比如下面这种:
    https://www.jianshu.com/p/919d066a07aa
    https://blog.csdn.net/xdsm1234/article/details/78834893

    但是这种写法实际上是url字符串拼接的方式进行转发参数。虽然低级了点,但是大多数情况下也满足我们的需要。最近在使用过程中发现特殊字符在转发之后全变成空格了。比如+&>这些,在业务端都不能正常接收到。在网上找了半天也没找到解决办法。没办法只有自己上了。我去看了下RequestTemplate的源码。发现里面是有办法解决的。上代码:

    import feign.Request;
    import feign.RequestInterceptor;
    import feign.Retryer;
    import feign.codec.Encoder;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.ObjectFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
    import org.springframework.cloud.openfeign.support.SpringEncoder;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
    
    import javax.servlet.http.HttpServletRequest;
    import java.io.ByteArrayOutputStream;
    import java.io.InputStream;
    import java.util.Enumeration;
    import java.util.HashMap;
    import java.util.Map;
    
    
    @Configuration
    public class FeignConfiguration {
        private Logger logger = LoggerFactory.getLogger(FeignConfiguration.class);
        public static int connectTimeOutMillis = 90000;//超时时间
        public static int readTimeOutMillis = 90000;
        @Autowired
        private ObjectFactory<HttpMessageConverters> messageConverters;
    
        @Bean
        public MyConcurrencyStrategy feignHystrixConcurrencyStrategy() {
            return new MyConcurrencyStrategy();
        }
    
        @Bean
        public Encoder feignEncoder() {
            return new SpringMultipartEncoder(new SpringEncoder(messageConverters));
        }
    
        @Bean
        public Request.Options options() {
            return new Request.Options(connectTimeOutMillis, readTimeOutMillis);
        }
    
        @Bean
        public Retryer feignRetryer() {
            Retryer retryer = new Retryer.Default(100, 1000, 4);
            return retryer;
        }
    	
    	 @Bean
        public RequestInterceptor requestInterceptor() {
            RequestInterceptor requestInterceptor = (requestTemplate) -> {
                ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
                        .getRequestAttributes();
                HttpServletRequest request = attributes.getRequest();
                Enumeration<String> headerNames = request.getHeaderNames();
                try {
                    if (headerNames != null) {
                        while (headerNames.hasMoreElements()) {
                            String name = headerNames.nextElement();
                            String values = request.getHeader(name);
                            requestTemplate.header(name, values);
                        }
                    }
    				logger.info("接口路径:"+request.getRequestURL().toString());
                    StringBuffer body = new StringBuffer();
    				Enumeration<String> bodyNames = request.getParameterNames();
    				if (bodyNames != null) {
    					Map map=new HashMap();
    					while (bodyNames.hasMoreElements()) {
    						String name = bodyNames.nextElement();
    						String values = request.getParameter(name);
    						requestTemplate.query(name, values);
    						map.put(name,values);
    					}
    					logger.info("传入参数:"+map);
    				}
    				} catch (Exception e) {
                    e.printStackTrace();
                }
            };
            return requestInterceptor;
        }
    }
    

    最主要的区别就是使用requestTemplate.query(name, values)这个方法来进行参数转发,这样特殊字符也可以正常转发了;

    展开全文
  • request 转发转发包含,重定向

    千次阅读 2016-10-01 18:28:32
    1)实现转发实现 // [1] 实现转发 RequestDispatcher dispatcher = request.getRequestDispatcher("/Demo01"); // 直接就是 中的路径 dispatcher.forward(request, response); // 使用转发之前不能使用 ...
    1)实现转发实现


    // [1] 实现转发
    RequestDispatcher dispatcher = request.getRequestDispatcher("/Demo01"); // 直接就是<url-pattern> 中的路径
    dispatcher.forward(request, response);

    // 使用转发之前不能使用 PrintWrite out = response.getWrite();  
    out.print("你好");  输出,这样写没有什么错,
    但是一旦使用  out.flush(); // 清空缓存,显示内容就会。 报错
    java.lang.IllegalStateException:




    // [2]实现转发包含
    RequestDispatcher dispatcher = request.getRequestDispatcher("/Demo01"); // 直接就是<url-pattern> 中的路径
    dispatcher.include(request, response); // 既可以携带上 转发前servelt 输出内容,又可以输出 转发后页面的数据。




    /*
    * [1] 共享同一个 requeset 对象。
    * [2] 可以使用 setAttribute  getAttribute
    * [3] forward 可以访问 同一个项目下的 所有资源文件,比如 /WEB-INF/web.xml 文件  (WEB-INF目录下的资源是私有化的,通过路径的方式不能登陆进去,而forward不是通过路径访问的,所以可以访问。include 也不能访问这个目录。)

    * 注意点 :使用forward 和 include 不会改变 地址。 重定向会改变路径
    *    其中跳转的路径地址直接就是 web.xml 中 <url-paramter>中的地址值
    *    

    * */
    // [3]实现重定向
    response.sendRedirect("Demo02"); // 地址栏  /项目名/servlet名  但是直接填  servlet名字 在地址自动生成了 /Day927/Demo02


    //地址栏会发生变化
    // 是客户端的两次访问服务器,所以在地址栏发生变化,所以在重定向到另一个页面,使用的是 doget() 方法。


    //在重定向情况下,第二次的request是找不到第一次request域对象中的内容


    //在重定向情况下,request域对象不能用了,我们servletContext域对象替代。


    ——————————————————————————————————————————————————————————
    请求转发和请求包含
    1. 都是在一个请求中跨越多个Servlet
    2. 多个Servlet在一个请求中,他们共享request对象,就是AServlet中setAttribute()保存数据在BServlet中getAttribute()取出数据
    3. AServlet转发到BServlet,那么整个请求由BServlet来完成,AServlet不在插手
    4. AServlet包含BServlet,那么两个Servlet共同完成处理请求。
    5. 请求转发和请求包含都需要使用一个对象RequestDispatcher


    RequsetDispatcher rd = request.getRequestDispatcher("/BServlet"); //参数路径与被转发或被包含的Servlet的<url-pattern>一致
    rd.forward(request,response);  //请求转发 
    rd.include(request,response);  //请求包含




    请求转发: 由AServlet转发到BServlet


    在AServlet中可以添加响应头,不能添加响应体。




    请求包含:AServlet包含BServlet
    在AServlet中既可以添加响应头,也可以添加响应体。


    请求转发是一个请求,而重定向是2个请求
    请求转发后浏览器地址栏不会发生变化,重定向会发生变化
    请求转发的目标只能是本项目中的资源,重定向的目标可以是其他应用
    请求转发对AServlet和BServlet的请求方法是相同的,就是要么都是GET,要么都是POST,因为他们是同一个请求。
    请求转发可以在多个Servlet中共享request的数据,而重定向不行。





    展开全文
  • request转发、重定向

    2010-12-23 20:26:00
    区别一:重定向时浏览器上的网址改变转发是浏览器上的网址不变区别二:重定向实际上产生了两次请求转发只有一次请求重定向图解:(向客户端发出两次request请求)发送请求 -->服务器运行-->响应请求,返回给浏览器一个...

    区别一:

    重定向时浏览器上的网址改变

    转发是浏览器上的网址不变

    forward 是服务器请求资源,服务器直接访问目标地址的URL,把那个URL 的响应内容读取过来,然
    后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中
    还是原来的地址。
    redirect 就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器
    会用刚才请求的所有参数重新请求,所以session,request 参数都可以获取。

    区别二:

    重定向实际上产生了两次请求

    转发只有一次请求

     

    重定向图解:(向客户端发出两次request请求)

     

    发送请求 -->服务器运行-->响应请求,返回给浏览器一个新的地址与响应码-->浏览器根据响应码,判定该响应为重定向,自动发送一个新的请求给服务器,请求地址为之前返回的地址-->服务器运行-->响应请求给浏览器

     

    转发图解:(只向服务器发出一次请求)

     

    发送请求 -->服务器运行-->进行请求的重新设置,例如通过request.setAttribute(name,value)-->根据转发的地址,获取该地址的网页-->响应请求给浏览器

     

    区别三:

    重定向时的网址可以是任何网址

    转发的网址必须是本站点的网址

    展开全文
  • response重定向和request转发 通俗易懂

    千次阅读 2015-03-16 21:36:24
    在做web项目时我们经常会... 为什么response重定向和为什么request转发?  当我们些许的去思考这个问题的时候,是否和我一样有恍然大悟的感觉呢。   request转发    首先说说request,他是用户需求数据的
  • node下使用request转发http请求

    千次阅读 2017-10-31 16:55:39
    有一个简单的工具可以用,Simplified HTTP request client,可以比较方便的模拟请求。安装request模块在项目的node_module文件夹下执行以下命令npm install request --save使用get请求var request = require('reques
  • servlet页面request转发集合到jsp页面

    千次阅读 2017-04-09 11:16:33
    在不同页面间传值使用request.setAttribute()时,只会从一个jsp页面到另一个jsp页面进行一次传递,之后它就会失去它的作用范围。...通过页面转发,并将数据请求转向getRequestDispatcher()方法中参数定义的页面或者链接
  • request转发与response重定向(面试题)

    千次阅读 2016-10-29 20:48:04
    请求转发指的就是服务器内的资源的跳转,请求转发时,就会形成一个请求链,它们共享同一个request与response对象。也就是说,它们之间就存在一个request域。 要想实现请求转发可以通过request对象的...
  • response重定向和request转发的去呗

    千次阅读 2015-06-15 21:35:09
    让你明白response.sendRedirect()与request.getRequestDispatcher().forward()区别  2011-01-17 15:52:29| 分类: JAVA&&JSP经典 | 标签:request response url jsp 页面 |举报|字号 订阅   ...
  • Servlet和Jsp中的Request转发、重定向

    千次阅读 2016-08-20 00:10:20
    我们先来看例子,然后在说原理细节这个例子就是一个html页面有3个链接,一个转发、一个重定向、一个登录<a href="loginServlet">loginServlet <a href="forwardServlet">forwardServlet ...
  • 在做web项目时我们经常会用到... 为什么response重定向和为什么request转发?  当我们些许的去思考这个问题的时候,是否和我一样有恍然大悟的感觉呢。   request转发    首先说说request,他是用户需求数据的
  • request、response、session、application、out、pagecontext、config、page、exception】 ===和servlet的servletContext对象区别。两码事。 取值范围:不常用。 具体参考:...
  • demo.jsp ->request转发的页面。 *" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE ...
  • request请求转发

    千次阅读 2020-09-10 16:24:24
    request请求转发 什么是请求转发? 浏览器访问servlet1,Servlet1将参数处理...搜索功能案例:servlet中request转发图解: 请求转发的代码实现: Dispatcher01Servlet package com.lbl.servlet; import javax.serv
  • Request请求转发详解

    千次阅读 2020-07-07 16:16:46
    直接来,RequestDemo5代码,get请求和post请求都请求转发了,转发RequestDemo6请求 RequestDemo5代码 package com.lingaolu.request; import javax.servlet.RequestDispatcher; import javax.servlet....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 174,070
精华内容 69,628
关键字:

request转发