重定向与转发

在这里插入图片描述
重定向:
当浏览器给服务器发送请求时,A请求完成逻辑后,但是浏览器还想要其他结果,此时A不能返回这些结果,它只能给浏览器返回302重定向,告诉浏览器B请求有你的结果,浏览器就会请求B,B会返回结果给浏览器。

  • 重定向的A和B是没有直接联系的,是低耦合的关系。
  • 重定向的A和B是两次请求,就是在URL地址栏会显示两次不一样的请求地址
  • 重定向可以访问其他服务器的内容,比如可以重定向到www.baidu.com百度
  • 如果A要给B传输信息,那么只能通过cookie和session去携带信息。因为是两次请求,那么就是有2个request,A和B的request不一样,不能通过request共享数据
  • 比如在登录认证的时候,如果认证成功,那么就会从登录页面转到首页,这就是2次不一样的请求地址。

转发:
浏览器给服务器发送请求,这个逻辑需要A和B配合完成,A完成一半,B在完成另一半,由B响应给浏览器。这是一种连接耦合的关系。但是浏览器并不知道B的存在,一直以为是A响应给它,所以URL地址栏只会显示A的请求地址,所以是一次请求,服务器内部的跳转。

  • 转发的A和B是耦合的关系,是有直接联系的。
  • 转发是一次请求,就是在URL地址栏只会显示浏览器请求A的地址
  • 转发只能访问本服务器内部的资源,因为服务器内部的跳转,浏览器并不知道,浏览器认为发送的请求只是那一次请求,无论服务器内部跳转多少次,请求还是那一次。
  • 如果A要给B发送信息,直接通过request携带发送,因为前后都是一次请求,那么就只有1个request,这样转发就可以通过request共享数据。这也是比重定向好的地方。
  • 比如在登录认证的时候,如果认证失败,那必须得重新回到登录页面继续登录,这样前后都还是登录页面,就是浏览器请求地址一样,那么转发可以,就是一次请求。这里可以用B返回到登录页面,但是浏览器并不知道B的存在,一直以为是A响应给它,这样就会一直停在登录页面,登录页面显示认证失败信息就行。
@Override
    protected void configure(HttpSecurity http) throws Exception {
        // 登录相关配置,
        http.formLogin()
                .loginPage("/loginpage")//登录页面 /loginpage
                .loginProcessingUrl("/login") //登录处理路径 /login
            //认证成功的结果
                .successHandler(new AuthenticationSuccessHandler() {
                    @Override
                    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
/*此处用重定向是因为认证成功就可以登录成功,就可以进入首页了,
不用停留在登录页面,所以是2次请求,采用低耦合的关系,
登录请求和首页请求是没有直接联系的。记住重定向是2次请求,
每次请求的request不一样,所以A要给B传信息,不能通过request,
只能通过cookie和session携带信息。这也证明A和B是低耦合的。*/
                        response.sendRedirect(request.getContextPath() + "/index");
                    }
                })
            //认证失败的结果
                .failureHandler(new AuthenticationFailureHandler() {
                    @Override
                    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) throws IOException, ServletException {
/*此处用跳转是因为认证失败,还要回到登录页面继续登录请求,
既然一个请求,直接用跳转到登录页面,同时也给登录页面返回错误的
认证信息,因为一个请求所以是用一个request,这样就可以
通过request携带错误信息。 这里用转发另外一个原因是此处
不是controller,不能return login.html。*/
                        request.setAttribute("error", e.getMessage());
                        request.getRequestDispatcher("/loginpage").forward(request, response);
                    }
                });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值