文文在搬砖 2017-04-09 00:54 采纳率: 0%
浏览 860

springmvc拦截器跳转问题

public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
HttpSession session = httpServletRequest.getSession();
Object UserId = session.getAttribute("userId");

        String InterUri =  httpServletRequest.getServletPath();
    String requesturl = httpServletRequest.getRequestURI();
    String contextpath = httpServletRequest.getContextPath();
    String url = requesturl.substring(contextpath.length());




    if ( null ==UserId){
        if (httpServletRequest.getCookies()!=null) {
            Cookie[] cookies = httpServletRequest.getCookies();
            if (cookies != null && cookies.length > 0) {



                String usercook = null;

                for (Cookie cookie : cookies) {
                    if ("UserCookie".equals(cookie.getName())) {
                         usercook = cookie.getValue();
                        String[] Susercook = usercook.split(",");
                        if (Susercook.length == 3) {
                            int userId = Integer.parseInt(Susercook[0]);
                            User user = userService.findbuId(userId);
                            String username = Susercook[1];
                            String password;
                            if (username.indexOf("@") > 0) {
                                password = Susercook[2];
                                if (username.equals(user.getEmail()) && password.equals(user.getPassword())) {
                                    session.setAttribute("UserId", userId);
                                   break;
                                }
                            } else {//手机登录
                                password = Susercook[2];
                                if (username.equals(user.getPhone()) && password.equals(user.getPassword())) {
                                    session.setAttribute("userId", userId);
                                     break;

                                }
                            }

                        }

                    }
                }
             if (usercook!=null){

                 return true;
             }

            }
        }

    }
    else{//id

// httpServletResponse.sendRedirect(httpServletRequest.getContextPath() +"/Main.jsp");

        if(null != allowUrls && allowUrls.length>=1){
            for(String path : allowUrls) {
                if(url.contains(path)) {

                    return true;
                }
            }
        }

    }

    return true;

}

有没有大神帮下忙,为什么 responsesendredirect(页面)根本没反应 还不能return false,不然静态资源又会被拦截,跳页面时候 httpServletRequest.getServletPath();全是静态资源路径没有跳转的页面路径,我的跳转不经过controller跳转,直接页面跳页面,session也得刷新一下页面才能拿得到,感觉好影响项目效率。在线等,好急啊,做了好几天没解决。

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-05 16:51
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在Spring MVC中,当使用HttpServletRequest对象时,你可以通过设置request.getRequestDispatcher()来获取一个新的请求处理程序实例。这可以让你更容易地控制对特定URL的响应和重定向。

    以下是一个示例,展示了如何实现你的需求:

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
    
    public class MyHandlerInterceptor extends HandlerInterceptorAdapter {
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            // 在这里添加你的逻辑
    
            if(response.isCommitted()){
                // 如果响应已经被提交,那么你需要确保将当前的request和response传递回给原来的handler
                modelAndView.addObject("request", request);
                modelAndView.addObject("response", response);
    
                // 然后调用handler的doPost方法
                handler.doPost(modelAndView);
            }
        }
    }
    
    

    在这个例子中,我们创建了一个自定义的拦截器,并在它的postHandle方法中实现了我们的逻辑。如果你希望在处理某个URL之前或者之后进行一些操作,这个方法就是一个很好的选择。

    然后,在你的控制器方法上应用这个拦截器:

    @ControllerAdvice
    public class MyControllerAdvice {
    
        @PreAuthorize("hasRole('ROLE_USER')")
        @RequestMapping("/myUrl")
        public String myMethod(HttpServletRequest request, HttpServletResponse response) throws IOException {
            // 你的业务逻辑...
        }
    }
    

    现在,当你访问/myUrl时,你的控制器会先执行@PreAuthorize注解中的授权检查,然后再处理你的业务逻辑。这样,你就可以在某些情况下决定是否返回一个响应,以及如何返回它。

    评论

报告相同问题?

悬赏问题

  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。