springmvc拦截器实现自动登录

2014/07/14 6984点热度 0人点赞 2条评论

1)实现HandlerInterceptor接口

2)在springmvc的配置文件中配置拦截器使其生效

  如:

 <!-- 拦截器 -->  
    <mvc:interceptors>  
        <!-- 多个拦截器,顺序执行 -->  
        <mvc:interceptor>  
           <mvc:mapping path="/**" /><!-- 如果不配置或/**,将拦截所有的Controller,/*表示拦截第一层 -->  
           <bean class="com.yxkong.common.interceptor.WebCommonInterceptor"></bean>  
        </mvc:interceptor>  
        <mvc:interceptor>  
           <mvc:mapping path="/**" /><!-- 如果不配置或/**,将拦截所有的Controller -->  
           <bean class="com.yxkong.common.interceptor.CommonInterceptor"></bean>  
        </mvc:interceptor>  
    </mvc:interceptors>

springmvc拦截实现自动登录代码

package com.yxkong.common.interceptor;

import java.util.Arrays;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import com.yxkong.common.utils.StringUtil;
import com.yxkong.common.web.vo.AuthenToken;
import com.yxkong.system.model.BaseResource;
import com.yxkong.system.model.BaseUser;
import com.yxkong.system.service.IBaseResourceService;
import com.yxkong.system.service.IBaseUserService;

public class CommonInterceptor implements HandlerInterceptor {
	@Resource
	private IBaseUserService baseUserService;
	@Resource(name="baseResourceService")
	private IBaseResourceService resourceService;
	 /** 
     * 在业务处理器处理请求之前被调用 
     * 如果返回false 
     *     从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链 
     *  
     * 如果返回true 
     *    执行下一个拦截器,直到所有的拦截器都执行完毕 
     *    再执行被拦截的Controller 
     *    然后进入拦截器链, 
     *    从最后一个拦截器往回执行所有的postHandle() 
     *    接着再从最后一个拦截器往回执行所有的afterCompletion() 
     */  
	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		/**
		 * 自动登录拦截实现
		 *    1),获取用户的session中的AuthenToken
		 *        存在:不做任何操作
		 *   不存在:
		 *    2),获取Cookie中的用户ID,存在,获取该用户的详细信息,保存到session
		 *   Cookie不存在
		 *    3),获取当前访问url
		 *    4),获取web.xml中放行的地址
		 *    5),如果访问的url不是放行的地址,跳转到登录页面
		 */
		String parentPath=request.getContextPath();
		HttpSession session=request.getSession();
		AuthenToken authenToken=(AuthenToken) session.getAttribute("AuthenToken");
		if(null==authenToken){
			Cookie[] cookies=request.getCookies();
			if(cookies!=null&&cookies.length>0){
				for (Cookie cookie : cookies) {
					if ("userId".equals(cookie.getName())) {
						String userId = cookie.getValue();
						BaseUser user = baseUserService.findById(userId);
						if(user!=null){
							authenToken=new AuthenToken();
							authenToken.setNickName(user.getNickName());
							authenToken.setGender("女");
							if(user.getSex()==1){
								authenToken.setGender("男");
							}
							authenToken.setLoginTime(new Date());
							authenToken.setLoginName(user.getLoginName());
							authenToken.setUserId(userId);
							session.setAttribute("AuthenToken", authenToken);
							//获取资源
							BaseResource resc=new BaseResource();
				        	List<BaseResource> listResc = resourceService.findListTree(resc);
				        	session.setAttribute("listResc", listResc);
							
							return true;
						}
					}
				}
				/**
				 * 如果以前登录没有选择记住密码
				 *   如果要访问的地址不是要放行的方法,那么拦截跳转到登录页面
				 *   是要放行的方法,放行
				 */
				String path = request.getRequestURI();
				path = path.substring(path.lastIndexOf("/"));
				String noLoginUrl = request.getSession().getServletContext().getInitParameter("noLoginUrl");
				if(StringUtil.isNotEmpty(noLoginUrl)){
					String[] noLoginUrlArr = noLoginUrl.split(",");
					List<String> list = Arrays.asList(noLoginUrlArr);
					if(list!=null&&list.contains(path)){
						return true;
					}
				}
				
			}
			response.sendRedirect(parentPath+"/tologin");
			return false;
		}
		return true;
	}
	/**
	 * 在业务处理器处理请求执行完成后,生成视图之前执行的动作
	 */
	@Override
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
	}
	/** 
     * 在DispatcherServlet完全处理完请求后被调用  
     *   当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion() 
     */ 
	@Override
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
	}

}

yxkong

这个人很懒,什么都没留下

文章评论

  • 匿名

    http://www.oschina.net/question/6556_233128
    请问这是怎么回事?

    2015/04/21
    • yxkong

      @匿名 第一次是通过response把浏览器的cookie给删除了,但你还没有到浏览器啊,你直接调用了拦截器,那不就还是原来的request请求啊,获取到cookie很正常。你可以返回浏览器再调用这个拦截器试试

      2015/04/22