需求:用户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.这样跳转来的登陆界面,根本不能登录,可以输入帐号密码,却不能发送登录请求
发送的请求不会是异步的吧!
重定向路径貌似有问题吧?response.sendRedirect(request.getContextPath() + "/login.jsp");
String location = "/login.jsp" ;
response.sendRedirect(location);应改为response.sendRedirect(request.getContextPath() + "/login.jsp");
"".equals(obj.toString())应该写成"".equals(string.valueof(obj).trim())这种写法会比较严密,如果你的obj是null的话tostring()是会报空指针的
感觉是你的路径有问题,应该是写错路径了吧
怎么这样搞啊,为什么不用注解@RequestMapping
null == obj || StringUtils.isEmpty(obj.toString()) 使用这样的方法判断
路径问题吧,你可以这样试试:response.sendRedirect(request.getContextPath() + "/WEB-INF/login.jsp");
我没看到你的login.jsp在哪个文件夹里面,还是直接在WEB-INF下,你自己看看
而且,用@RequestMapping注解比较简单
为什么你配置一个视图解析器呢?
下面这样写的话,你试试把login.jsp放在webapp目录下面。或者试试先跳转到index.jsp看看能不能
if (obj == null || "".equals(obj.toString())) {
String location = "/login.jsp"
;
response.sendRedirect(location);
return false;
}
谢谢所有朋友了,我解决了这个问题了。
我把所有的请求都通过controller(也可以是sevelet)来进行跳转了,这样做既可以避免有人直接在浏览器输入jsp文件访问而跳过登录,又方便进行拦截器拦截。
配置文件我基本没改,拦截代码也只是丰富了一下。拦截下来请求以后通过response给页面发送一个提示,避免直接跳转登录页面,没头没脑的让用户以为是网站崩溃了呢