springmvc框架,HandlerInterceptor拦截器跳转不了

需求:用户session十分钟内无请求就会自动删除。无论用户发送什么请求都要被拦截器拦截,并跳转到登录页面。
问题:拦截器能拦截到用户的访问行为,可是,跳转语句五法执行。
我的代码
HandlerInteceptor:

 @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object arg2) throws Exception {
        HttpSession session = request.getSession(true);
        // session中获取用户名信息
        Object obj = session.getAttribute(Constant.LOGIN_SESSION);
        System.out.println("session中的数据:---> " + obj);
        if (obj == null || "".equals(obj.toString())) {
            String location = "/login.jsp"
            ;
            response.sendRedirect(location);
            return false;
        }
        return true;
    }

springmvc.xml拦截器配置:

 <!-- Session失效拦截 -->
    <mvc:interceptors>
        <!-- 定义拦截器 -->
        <mvc:interceptor>
            <!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->
            <mvc:mapping path="/**" />
            <!-- 不需要拦截的地址 -->
            <!-- 直接用ip:端口号可以打开登录页 -->
            <mvc:exclude-mapping path="/" />
            <!-- 可以浏览器地址栏输入login.jsp后缀访问登录页 -->
            <mvc:exclude-mapping path="/login.jsp" />
            <!-- 以下为静态资源,不需要过滤 -->
            <mvc:exclude-mapping path="/App/**" />
            <mvc:exclude-mapping path="/common/**" />
            <mvc:exclude-mapping path="/css/**" />
            <mvc:exclude-mapping path="/image/**" />
            <mvc:exclude-mapping path="/js/**" />
            <mvc:exclude-mapping path="/jsp/**" />
            <mvc:exclude-mapping path="/kindeditor/**" />
            <mvc:exclude-mapping path="/lib/**" />
            <bean class="com.ryzh0310.interceptor.SystemSessionInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

web.xml中session删除配置(为了测试我写了最小时间1):

 <!-- 登录退出session控制 -->
    <session-config>
        <session-timeout>1</session-timeout>
    </session-config>

我的项目结构:
图片说明

先谢谢你们啊
你们说我的重定向路径应该写成request.getContextPath()
而不应该直接写成/login.jsp
我打印了日志了,日志内容是:
request.getContextPath() = /login.js

请帮我看下是不是其他问题吧。

我用的是springmvc+mybatis

抱歉,我是这么测试的,结果就是上面那行日志内容

 System.out.println("request.getContextPath() = "
                    + request.getContextPath() + "/login.jsp");

先感谢大家了。

我改了改springmvc.xml配置文件,

 <!-- Session失效拦截 -->
    <mvc:interceptors>
        <!-- 定义拦截器 -->
        <mvc:interceptor>
            <!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->
            <mvc:mapping path="/**" />
    <!-- 不需要拦截的地址 -->
            <mvc:exclude-mapping path="/login.jsp" />
            <mvc:exclude-mapping path="/user/login" />
            <mvc:exclude-mapping path="/App" />
            <mvc:exclude-mapping path="/common" />
            <mvc:exclude-mapping path="/css" />
            <mvc:exclude-mapping path="/image" />
            <mvc:exclude-mapping path="/js" />
            <mvc:exclude-mapping path="/jsp" />
            <mvc:exclude-mapping path="/kindeditor" />
            <mvc:exclude-mapping path="/lib" />
            <bean class="com.ryzh0310.interceptor.SystemSessionInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

mvn:mapping Path由 "/" 改为 "/**"
mvc:exclude-mapping path也由 "/file/**"改成了"/file"

现在的情况是:
1.可以跳转到登录界面了,然而地址栏上显示的是被拦截的请求所请求的目标界面的url。
2.这样跳转来的登陆界面,根本不能登录,可以输入帐号密码,却不能发送登录请求

11个回答

发送的请求不会是异步的吧!

show_zhou
show_zhou 你好,我也遇到了这个问题,想问下怎么在解决的
接近 2 年之前 回复
z469441432
亲爱的Joe 回复D1208: 我这里虽然不是你说的问题,不过我查了下确实你说的这种情况是存在的。谢谢你啊。
2 年多之前 回复
D1208
D1208 回复亲爱的Joe: 我用过ajax异步,也是这种情况!我的方式是,成功拦截后,回写信息(response.getWriter().print("...")),然后在ajax的success函数里面用window.location.href=url来重定位的
2 年多之前 回复
z469441432
亲爱的Joe 我不是太明白,请求同步或者异步跟这个没关系吧?难道HandlerInterceptor拦截还分同步同步?
2 年多之前 回复

"".equals(obj.toString())应该写成"".equals(string.valueof(obj).trim())这种写法会比较严密,如果你的obj是null的话tostring()是会报空指针的

YINGZI52092
YINGZI52092 StringUtils.isBlank(string.valueof(obj));
2 年多之前 回复
Mr_Huang_ning
Mr_Huang_ning https://www.cnblogs.com/ll409546297/p/6203403.html个应该可以解决你的问题
2 年多之前 回复
Mr_Huang_ning
Mr_Huang_ning 如果请求是异步请求,拦截后跳转是没有办法的。。。
2 年多之前 回复
Mr_Huang_ning
Mr_Huang_ning 执行后是报错吗?
2 年多之前 回复
z469441432
亲爱的Joe 谢谢你啊,我嫌那样麻烦,所以用短路或||先对obj判断了
2 年多之前 回复

代码没问题但是页面没跳转吗?

z469441432
亲爱的Joe 是的,而且我从浏览器里面直接输入jsp地址也能访问
2 年多之前 回复

重定向路径貌似有问题吧?response.sendRedirect(request.getContextPath() + "/login.jsp");

z469441432
亲爱的Joe 我试下吧
2 年多之前 回复

String location = "/login.jsp" ;

response.sendRedirect(location);应改为response.sendRedirect(request.getContextPath() + "/login.jsp");

感觉是你的路径有问题,应该是写错路径了吧

怎么这样搞啊,为什么不用注解@RequestMapping

z469441432
亲爱的Joe 这个类不是controller,是HandlerInterceptor类。
2 年多之前 回复

null == obj || StringUtils.isEmpty(obj.toString()) 使用这样的方法判断

路径问题吧,你可以这样试试:response.sendRedirect(request.getContextPath() + "/WEB-INF/login.jsp");
我没看到你的login.jsp在哪个文件夹里面,还是直接在WEB-INF下,你自己看看
而且,用@RequestMapping注解比较简单

为什么你配置一个视图解析器呢?

z469441432
亲爱的Joe login.jsp与web-inf在同一个目录
2 年多之前 回复

下面这样写的话,你试试把login.jsp放在webapp目录下面。或者试试先跳转到index.jsp看看能不能

 if (obj == null || "".equals(obj.toString())) {
            String location = "/login.jsp"
            ;
            response.sendRedirect(location);
            return false;
        }
共11条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问