今天是在学习拦截器的时候再度提起了这个问题,原本这个联系不怎么大,只是在运行这块时分别拦截了登录和表单的提交才纠结起这个问题,下面是正在写的拦截器部分代码
public boolean preHandle(
HttpServletRequest request,
HttpServletResponse response,
Object arg2) throws Exception {
System.out.println("--preHandle实现登录检查--");
HttpSession session = request.getSession();
//获取登录成功后放置的用户信息
String name = (String)session.getAttribute("username");
System.out.println(name);
if(name != null){//登录过
System.out.println(name);
return true;//继续执行mvc后续流程
}else{//未登录或登录失效
response.sendRedirect("tologin.do");
System.out.println("是我");
return false;//终止mvc后续流程
}
}
而后就是在XML属性文件中配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截哪些请求 -->
<mvc:mapping path="/**"/>
<!-- 放过哪些请求,我是让放过了初始登陆页的请求而拦截表单提交请求 -->
<mvc:exclude-mapping path="/tologin.do"/>
<bean class="org.yang.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
因为登录程序中没有设置拦截器,所以可以很顺利的打开登录表单页面(如果登录程序也设置拦截器,那么我们就无法登录这个页面,因为一开始username的值就是NULL,所以页面出错也就是一致无法重定向),当我们点击登录按钮提交表单时,这时候程序才开始创建session,但是因为拦截器的作用session中并没有绑定到username的值,也就是username的值一致为NULL。
程序执行到HttpSession session = request.getSession();才开始创建了session。
后面查阅资料发现,只有当server端程序调用HttpServletRequest.getSession(true)这样的语句时才被创建,而不是说在客户端访问时就被创建,**而且JSP有创建session的机制,只要我们在创建JSP文件时没有显示的使用 <%@page session=”false”%> 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句HttpSession session = HttpServletRequest.getSession(true)而创建session
。**
所以session在有客户端访问时就被创建看来就是一个误解。
上面只是个人今天下午看拦截器时想到的,还不知道准确性怎么样,等深深探究在回头学习。你可能要问为什么和session过不去,那就是以为它消耗内存资源呗。。。。。。。。。。。。。