拦截器实现未登录跳转

来源:互联网 发布:三维动画制作软件手机 编辑:程序博客网 时间:2024/04/30 15:39

下面用实际登陆跳转举例

1、写自己的拦截器implements HandlerInterceptor,实现跳转去执行拦截内容并传,执行拦截之后的URI

@Componentpublic class LoginRequiredInterceptor implements HandlerInterceptor {@AutowiredHostHolder hostHolder;//目前页面是需要登陆,如果没有登陆应该先跳到登陆界面@Overridepublic boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {    if (hostHolder.getUser()==null){        httpServletResponse.sendRedirect("/reglogin?next="+httpServletRequest.getRequestURI());    }    return true;}@Overridepublic void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {}@Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {}}

2、WebMvcConfigurerAdapter中注册自己写的拦截器,并添加拦截路径/user/*

@Componentpublic class WendaWebConfiguration extends WebMvcConfigurerAdapter {@AutowiredLoginRequiredInterceptor loginRequiredInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {    registry.addInterceptor(loginRequiredInterceptor).addPathPatterns("/user/*");    super.addInterceptors(registry);}}

3、将要去往拦截事务的jsp,这是一个中间过渡页面。用@param后去得到URI,并添加到渲染的页面,也就是你需要临时跳转页面去view层中

@RequestMapping(path = "/reglogin")public String reglogin(Model model,                       @RequestParam(value = "next" ,required = false) String next){    model.addAttribute("next",next);//把拦截器带来的参数放在model层中去    return "login";}

4、到达拦截事务的jsp,处理拦截事务时候带上刚刚model中加入的参数

<input type="hidden" name="next" value="$!{next}"/>

5、到达拦截事务@Controller中,处理完成后,决定跳转

if (!StringUtils.isBlank(next)){     return "redirect:"+next;//登陆成功后跳转}

================================================

总结:

关于两次跳转方法发生的类:

第一次离开去执行自己写的拦截器,所以第一次redirect是在MyInterceptor中执行;

第二次是跳回来去执行一开始想要访问的页面,所以应该是在自己拦截器访问地址完成之后。如这里的loginController,之后。

关于几次跳转参数传递形式

第一次,redirect:reglogin+RequestURI();—-》controller[用@Param]—-》[model.addtribute]到达view层中—-》[

关于这里出现的两次Controller

第一次是跳到拦截事务中,第二次是拦截事务完成,[紧接着会执行拦截之后跳转]

0 0
原创粉丝点击