Spring mvc Interceptor 解决Session超时配置流程

最近公司内部框架中对Session超时这一功能未实现,由于采用iframe结构,Session超时后,当点击左侧系统菜单时,会在iframe的右侧再次弹出登陆框。

该问题是由于没有设置拦截器造成。

添加拦截器思路:当Session超时后,用户点击menu时,需要用Interceptor进行前项拦截,并判断此时session中是否还存在用户信息,如果不存在,将其指定登陆主页面。

如下代码:

1)首先在applicationContext-mvc.xml中加入mvc:interceptor标签。 

    
    <!-- session timeout interceptor -->
	<mvc:interceptors>
		<mvc:interceptor>
			<mvc:mapping path="/*/*" />
			<bean class="com.lenovo.lstp.mam.interceptor.SessionTimeoutInterceptor" >
				<property name="allowUrls">  
			        <list>  
			          <value>/login/login.do</value>  
			          <value>/common/language.do</value>  
			        </list>  
		     	</property>  
		    </bean>
		</mvc:interceptor>
	</mvc:interceptors>
	
	<!-- exception handler -->
    <bean id="handlerExceptionResolver"
    	class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" >
    	<property name="exceptionMappings">
    		<props>
    			<prop key="com.lenovo.lstp.mam.exception.SessionTimeoutException">/blank</prop>
    		</props>
    	</property>
    </bean>


上述代码中首先要在系统内部包中创建一个名为SessionTimeoutInterceptor的拦截器,并指定允许的访问的url为list中集合。

 

当用户从此地址登陆后,无需进行拦截。

SessionTimeoutException中为当拦截生效后,会throw出该异常。

并进入blank.jsp页面。

2)第二步则要进行拦截器SessionTimeoutInterceptor创建,代码如下:

 

/**
	 * Session超时,拦截访问
	 * 
	 */
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		String requestUrl = request.getRequestURI();
		
		for(String url : allowUrls) {
			if(requestUrl.endsWith(url)) {
				return true;
			}
		}
		
		String session = (String) WebUtils.getSessionAttribute(request,
				"username");
		if(session != null) {
			return true;
		}else {
			throw new SessionTimeoutException();
		}
		
	}


除了被允许的Url,其他任何Url,只要没有检查到Session的存在,则会抛出SessionTimeoutException,用于去指向登陆页面,SessionTimeoutException中则无需写入任何操作。

 

3)由于iframe布局会造成登陆框内嵌问题,因此可以通过以下方式实现,代码如下:

 

  var session = "${user}";
  if("" == session){
  	top.location = "transfer.jsp";
  }
  if (null == session) {
	  top.location = "transfer.jsp";
  }

在blank.jsp中引入一个中转页transfer.jsp。这个页面用于进行post跳转,再次去请求login.do。

 

top.location为指定在主页面展示,而不是在内嵌的页面展示。

4)第四步则需要进行二次login.do的请求,代码如下:

 

<script type="text/javascript">
$(document).ready(function(){
	document.transfer.submit();
});
</script>


<body>
<form name="transfer" action="login/login.do" method="post"></form>

</body>


当进入该页面,会自动提交login.do请求,但是之前由于页面允许了login.do的进入,该操作可以在loginControll中进行判断。

 

代码如下:

 

/* After session timeout, check dto's username, and return login.jsp. */
		if(dto.getUsername() == null) { 
			ModelAndView mv = new ModelAndView("login");
			return mv;
		}
		


在login方法中引入该判断 ,对二次访问该Controll的信息进行判断,如果用户名没有的话,则自动跳回login.jsp页面重新输入。

 

此时,已大功告成,如果登陆页面有其他链接,可以在allowurl去进行配置。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SpringMVC执行流程大致可以分为以下几个步骤: 1. 客户端发送请求至DispatcherServlet。 2. DispatcherServlet收到请求后,根据请求URL找到对应的Controller。 3. Controller接收请求后,调用Service层处理请求。 4. Service层处理请求后,将数据返回给Controller。 5. Controller将处理结果返回给DispatcherServlet。 6. DispatcherServlet将处理结果返回给客户端。 在执行流程中,DispatcherServlet是核心控制器,负责协调各个组件的工作,并根据请求URL找到对应的Controller。Controller负责接收请求并调用Service层处理请求。Service层处理请求并将数据返回给Controller。最终,Controller将处理结果返回给DispatcherServlet,DispatcherServlet将处理结果返回给客户端。 ### 回答2: Spring MVC是一种基于Java的Web开发框架,它提供了一套机制来帮助开发者构建灵活、模块化和可扩展的Web应用程序。 Spring MVC的执行流程如下: 1. 客户端发送HTTP请求到DispatcherServlet。DispatcherServlet是Spring MVC的核心控制器,它拦截所有的请求,然后根据请求的URL将请求转发给相应的控制器。 2. DispatcherServlet根据请求的URL查找处理该请求的控制器。在Spring MVC中,控制器是一个POJO类,使用@Controller注解标识。 3. 控制器处理请求并返回一个ModelAndView对象。在控制器中,可以通过注解@RequestMapping来映射请求URL到相应的方法。 4. DispatcherServlet根据控制器返回的ModelAndView对象选择相应的ViewResolver来解析视图。ViewResolver负责将逻辑视图名解析为具体的视图对象。视图通常是JSP、Thymeleaf 或者Freemarker等模板引擎。 5. ViewResolver返回视图对象给DispatcherServlet。 6. DispatcherServlet将Model对象传递给视图对象。在控制器中,可以通过注解@ModelAttribute将模型对象添加到请求域中。 7. 视图对象渲染响应结果并返回给DispatcherServlet。 8. DispatcherServlet将视图对象的渲染结果返回给客户端。 以上就是Spring MVC的执行流程。通过这一流程,我们可以灵活地处理Web请求并生成响应结果。Spring MVC提供了一套简洁而强大的机制,使得我们开发Web应用更加容易和高效。 ### 回答3: Spring MVC是基于MVC设计模式的一种轻量级的Web框架。其执行流程如下: 1. 客户端发送一个HTTP请求到服务器,并由前端控制器DispatcherServlet拦截请求。 2. DispatcherServlet是Spring MVC框架的核心组件,负责调度和协调请求的处理。它根据配置文件找到对应的处理器映射器HandlerMapping。 3. HandlerMapping将根据请求的URL找到对应的处理器Handler。 4. 执行处理器Handler,该处理器是一个有用户自定义代码编写的控制器Controller。处理器会根据业务逻辑进行处理,并返回一个ModelAndView对象。 5. ModelAndView对象包含了视图名称和模型数据。视图名称会被视图解析器ViewResolver解析为具体的视图。 6. 视图渲染器ViewResolver会根据视图名称找到对应的视图模板,将模型数据填充到视图模板中。 7. 最终,视图会被渲染成HTML响应返回给客户端。 在整个执行流程中,Spring MVC提供了许多扩展点,如拦截器Interceptor和处理器适配器HandlerAdapter等,开发者可以根据需求来进行配置和自定义。同时,Spring MVC还提供了各种注解和标签来简化开发,如@Controller注解用于标识控制器,@RequestMapping注解用于处理请求映射,以及<form:form>标签用于生成表单等。 总而言之,Spring MVC的执行流程清晰简洁,通过分层架构和配置文件,将请求的处理过程分解成各个组件的责任和协作,使得开发者可以更加专注于业务逻辑的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值