重定向:
当浏览器给服务器发送请求时,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);
}
});