重定向:二次请求(不同的request),地址栏的URL会变成重定向之后的URL,
重定向是客户端行为,可以转向到本web应用之外的页面和网站
对数据进行修改、删除、添加操作的时候,应该用response.sendRedirect()
浏览器会自动帮助用户进行二次请求,参数传递可以通过RedirectAttributes
重定向都是到方法路径上的,不能重定向到页面文件上
自定义拦截器需要四步骤,
1、创建我们自己的拦截器类并实现 HandlerInterceptor 接口。
5、拦截器中通过session获取用户
public class LoginInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
UserDo userDo=(UserDo)httpServletRequest.getSession().getAttribute("user");
if(null==userDo){
httpServletResponse.setStatus(HttpServletResponse.SC_FOUND);
httpServletResponse.sendRedirect("/login/loginPage");
}
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
2、创建一个Java类继承WebMvcConfigurerAdapter,并重写 addInterceptors 方法。
3、实例化我们自定义的拦截器,然后将对像手动添加到拦截器链中(在
addInterceptors方法中添加)
4、加入我们需要拦截的url路径与过滤的路径,这个@Configuration的含义是告诉spring,配置信息的类加到容器里
@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter{
@Override
public void addInterceptors(InterceptorRegistry registry){
LoginInterceptor loginInterceptor = new LoginInterceptor();
registry.addInterceptor(loginInterceptor).addPathPatterns("/**")
.excludePathPatterns("/login/loginPage").excludePathPatterns("/login/login")
.excludePathPatterns("/login/registerPage").excludePathPatterns("/login/register");
super.addInterceptors(registry);
}
}
拦截器中的转发
一次请求(相同的request),地址栏的URL不会改变,
转发是服务器行为 不能转向到本web应用之外的页面和网站,所以转向的速度要快
@RequestMapping(value="/testForWard",method=RequestMethod.GET)
public String testForward(){
return "forward:index";
}