`
xurichusheng
  • 浏览: 335875 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Spring 拦截器

阅读更多
1、在做项目的时候,遇到了一个Spring拦截器的问题。
项目框架:Spring2.5+hibernate3.0
基于Spring注解。

在登录成功后,将用户对象emp绑定在session上。

由于使用了注解,所以只能以方法参数的形式取得emp。

如:

/**
* Factory: 一个实体类
*
*/
@RequestMapping("/save.do")
public ModelAndView save(@ModelAttribute("emp")Employee emp,
                              Factory factory, ModelMap model){



    }


如果未登录,一调用这个方法,发现emp是null,马上抛出了异常,
根本不会进入方法体。

所以需要一个拦截器,判断是否登录,即emp是否是空的。

刚开始的时候,拦截器是这么写的:

public class SessionInterceptor extends HandlerInterceptorAdapter {

private final Logger logger = Logger.getLogger(SessionInterceptor.class);

/**
* 在业务处理器处理请求之前被调用
*/
@SuppressWarnings("unchecked")
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object obj) throws Exception {
// TODO Auto-generated method stub

Employee emp = (Employee)request.getSession().getAttribute("emp");

if(null == emp){
        //跳转到登录
response.sendRedirect("index.ftl");
return true;
}
return true;
}

/**
* 在业务处理器处理完请求后
*/
// public void postHandle(HttpServletRequest request, HttpServletResponse response,
// Object handler, ModelAndView model) throws Exception {
// // TODO Auto-generated method stub
//
//
// }

/**
* 在DispatcherServlet完全处理完请求后被调用
*/
// @Override
// public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
//      throws Exception{

// }

}

Spring 配置文件 applicationContext.xml

<!-- 拦截器-->
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="interceptors">
<list>
    <bean class="com.iss.delver.common.core.interceptor.SessionInterceptor" />
</list>
</property>
</bean>

<!-- error 表示一个错误的页面 error.ftl  -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 
      <property name="defaultErrorView">    
          <value>error</value>    
      </property>    
      <property name="exceptionMappings">    
          <props>    
              <prop key="java.sql.SQLException">    
                 error    
             </prop>    
         </props>    
     </property>    
</bean>


由于是在进入方法之前(preHandle)拦截的,所以,在拦截器中,
即使是第一次登录,emp也是null,所以永远都是跳转到index.ftl中。

这时,有2种方法可以解决这个问题:
第一种:在spring的配置文件中,将登录login.do排除。

第二种:将拦截器的preHandle(..)中的代码移到postHandle()中

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
     throws Exception{

logger.debug("===== afterCompletion ======");

//拿到绑定在  session 上的对象
Employee emp = (Employee)request.getSession().getAttribute("emp");

Tenant tenant = (Tenant)request.getSession().getAttribute("tt");

Classes cls = (Classes)request.getSession().getAttribute("cls");

if(null == emp || null==tenant || null==cls){
//如果未登录,则跳转到登录页面
response.sendRedirect("index.ftl");
}
}


<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 
      <property name="defaultErrorView">
           <!--  这里,将error换成index  -->
          <value>index</value>    
      </property>    
      <property name="exceptionMappings">    
          <props>    
              <prop key="java.sql.SQLException">    
                 error    
             </prop>    
         </props>    
     </property>    
</bean>

这样子的话,如果未登录,将会自动跳转到inde.ftl页面。

拦截器也起作用了。
1
4
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics