cari

Rumah  >  Soal Jawab  >  teks badan

java - AJAX 请求时,SpringMVC 拦截器无法获得 session 中的值

拦截器代码(想实现的功能就是如果当前 Session 中有 user,那么就可以访问页面和使用 AJAX 请求):

public class UserLoginInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {

        HttpSession session = request.getSession();
        if (session.getAttribute("user") != null) {
            return true;
        }

        request.getRequestDispatcher("/WEB-INF/views/page/user/login.jsp").forward(request, response);

        return false;
    }

}

该拦截器拦截了所有的方法(/**),对于返回 ModelAndView 的控制器方法对应的路径,拦截器可以正常获得 session 的值;但是对于 AJAX 访问的控制器方法(被 @ResponseBody 注解的方法)对应的路径,拦截器却无法获得 session 的值。请问这是什么原因呢,解决办法是什么?

大家讲道理大家讲道理2802 hari yang lalu898

membalas semua(1)saya akan balas

  • 高洛峰

    高洛峰2017-04-18 10:50:55

    Apabila

    SpringMVC memintas ajax permintaan, response.sendRedirect tidak boleh melompat seperti biasa. Anda boleh menentukan sama ada ia adalah permintaan ajax Jika ya, kembalikan mesej ke meja depan dan meja depan akan melompat ke halaman log masuk selepas menerimanya.

    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
    
        HttpSession session = request.getSession();
        if (session.getAttribute("user") != null) {
            return true;
        }
        // 如果是ajax请求,请求头会有x-requested-with
        String requestWith = request.getHeader("x-requested-with");
        if (requestWith != null && requestWith.equalsIgnoreCase("XMLHttpRequest")){
            ServletOutputStreamout = rep.getOutputStream();
            out.print("unlogin");//返回给前端页面的未登陆标识
            out.flush();
            out.close();
        } else {
            response.sendRedirect("/WEB-INF/views/page/user/login.jsp");
        }
        return false;
    }

    balas
    0
  • Batalbalas