springmvc 登录拦截器

拦截器起到了作用,跳到了登陆页面,登录页面是通过ajax提交请求给后台的,后台执行完了之后会返回一个map给ajax的success方法,从而进行页面的跳转。可是现在的问题是,后台执行了,但是跳不回前台,map也传回不去,更不说页面的跳转了。

5个回答

小机器人已经给你答案了:
1、不要拦截此跳转;
2、登录在后台执行了后,如果登录成功,直接更新一下登录session,这样过滤器就不会拦截了,想跳哪个页就跳哪个页;如果登录不成功,直接再跳转到登录页面。

daidaineteasy
晓呆同学 回复BearQueeN: 你检查一下,一班拦截器不会拦截返回信息的,要拦截也是拦截请求信息,检查一下ajax的数据格式设置还有返回的数据格式。都统一为Json格式
大约 4 年之前 回复
BearQueeN
BearQueeN 我不太会用这个。。我就自己回复了一下,贴了一下代码,请你帮我看看,谢谢
大约 4 年之前 回复
daidaineteasy
晓呆同学 回复BearQueeN: 嗯嗯 好的
大约 4 年之前 回复
BearQueeN
BearQueeN 请问,我怎么设置不拦截这个跳转啊?我把代码贴在楼下,你帮我看看好不好
大约 4 年之前 回复

这是login.jsp里面js方法

 function submitLogin(){

    var url = base_path+'login/loginManage';

    var validateCode= '${applicationScope.a_cache.sysConfigCache.baseDatas["config_show_login_validate_img"].value}';

    var req_data={};

    if(validateCode==1){
        req_data.authCode = $("#authCode").val();
    }

    //alert(validateCode);

    var userName=$("#userName").val();
    var password =$("#password").val();
    loadimage();
    //alert(url);
    $.ajax({
         type:"POST",
         url:url,
         data:{userName:userName,password:password},
         success:function(res){
         alert(res);
         testJson = eval("(" + res + ")"); 
         if(testJson.flag=="true"){
             alert("登陆成功");
            window.location = "/Test03"+testJson.url;
         }else{
            alert("登陆失败");
            return;
         }
         },



    });


}

这是后台接收并处理的方法:

 @RequestMapping(value = "/loginManage", method = RequestMethod.POST)
    @ResponseBody
    public Object login(User user,HttpServletRequest request){
        String redirect = request.getParameter("redirect");
        String flag="false";
        try{
            //User resultUser = userService.findByUserAndPassword(user);//核对用户名密码
            User resultUser = userService.findByUserAndPasswordForSpring(user);//核对用户名密码
            System.out.println("----------------------------"+resultUser);
            if (resultUser != null) {
                user = resultUser;
                logger.info("用户:"+user.getUserName()+"登陆成功");
                HttpServletRequest request1 = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
                HttpSession session = request1.getSession();
                session.setAttribute("session_user", user.getUserName());
                flag="true";

            }
        }catch (Exception e) {
            logger.error(e.getMessage());
            e.printStackTrace();
        }
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("url", "/manage/main");
        map.put("ok", "用户登陆成功!");
        map.put("flag", flag);
        return map;

    }

拦截器里这样写的:

  @Override
        public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
                Object arg2) throws Exception {

            String requestUri = arg0.getRequestURI();
            for (String url : excludedUrls) {
                System.out.println("excludedUrls:"+excludedUrls);
                System.out.println("requestUri:"+requestUri);
                System.out.println(requestUri.endsWith(url));
                if (requestUri.endsWith(url)) {
                    return true;  
                }
            }
            if (arg0.getHeader("x-requested-with") != null && arg0.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){ 
                //如果是ajax请求响应头会有,x-requested-with  
                System.out.print("发生ajax请求...");
                return true;
            }
            HttpSession session = arg0.getSession();
            if (session.getAttribute("session_user") == null) {
                System.out.println(arg0.getContextPath());
                arg1.sendRedirect(arg0.getContextPath() + "/login");
            }else{
                return true;
            }

            return false;
        }

你先看下这个过滤器方法,就是拦截登录的

     public void doFilter(ServletRequest req, ServletResponse res,
                FilterChain chain) throws IOException, ServletException {
            HttpServletRequest request = (HttpServletRequest) req;
            HttpServletResponse response = (HttpServletResponse) res;
            HttpSession session = request.getSession();
            if (session.getAttribute("currentAdmin") != null) {// 用户已经登录
                chain.doFilter(request, response);
            } else {
                String[] fxUrlArray = new String[] { "login.jsp", "login.do","createCode.do" ,"common/ajax.do","/out/","test.jsp","/common/","/clientExam/","/s.do"};// 不被拦截的地址
                StringBuffer url = request.getRequestURL();
                boolean bs = false;
                for (String fxUrl : fxUrlArray) {
                    if (url.indexOf(fxUrl) > 0) {// 放过不被拦截的地址
                        bs = true;
                        chain.doFilter(request, response);
                        break;
                    }
                }
                if (!bs) {// 未登录并且没有在不被拦截的地址里的跳转到登录页面
                    String contextPath = request.getContextPath();
                    String basePath = request.getScheme() + "://"
                            + request.getServerName() + ":"
                            + request.getServerPort() + contextPath;
                    response.sendRedirect(basePath + "/jsp/login.jsp");
                }
            }

        }
BearQueeN
BearQueeN 它拦截是成功的,只是把后台返回给ajax的跳转也拦截掉了,呜呜,我要疯了
大约 4 年之前 回复

你的代码中 将不需要拦截的请求添加到 excludedUrls 这个里边就好了。

daidaineteasy
晓呆同学 回复BearQueeN: 你这个确定是被拦截了而不是ajax没有设置返回格式是Json么
大约 4 年之前 回复
BearQueeN
BearQueeN 对的,可是js我是写在jsp页面里面的,所以不知道该怎么去设置不拦截它
大约 4 年之前 回复
     $.ajax({
                url:contextPath + "/version/getList.do", 
                type:"POST", 
                data:{
                    type:type,
                    pageNo:pageNo
                }, 
                dataType:"json",
                。。。。。。
BearQueeN
BearQueeN 谢谢啊。我返回的是一个map,不知道设置dataType:"json"还可不可以穿回来。之前没加过滤器是可以跳转的
大约 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问