当我们需要进行用户验证的时候,会使用到springmvc interceptor拦截器判断用户是否登录,如果用户没有正确登录,就需要让用户跳转到登录页面,如果登录,则能正常访问,那么我们该如何使用springmvc拦截器来做这一个功能呢?
springmvc interceptor拦截器和filter过滤器差不多,但是interceptor拦截器只能拦截Controller请求,而filter过滤器功能则更强大一点,本案例需要使用到session域对象来存储用户信息,然后通过自定义springmvc拦截器来拦截URL网址,并判断session里面是否有当前登录用户的信息,下面开始来学习吧!
步骤一:在web.xml文件中设置session过期时间,添加如下代码,session过期时间为20分钟,测试的话可以设置少一点:
<session-config> <session-timeout>20</session-timeout> </session-config>
步骤二:当用户请求controller类中的登录接口的时候,将用户信息存储到session域对象中,代码如下:
@PostMapping("user/doLogin") @ResponseBody public Map<String,Object> doLogin(HttpSession session,@RequestParam String username,@RequestParam String password){ Map<String,Object> map= new HashMap<String, Object>(); try{ if(!StringUtils.isEmpty(username.trim()) || !StringUtils.isEmpty(password)){ String pwdStr = DigestUtils.md5Hex(password); Users user = userService.findUserByUsernameAndPwd(username,pwdStr); if(user != null && user.getPassword().equals(pwdStr)){ map.put("msg", "ok"); //将用户信息存储到key为"LOGIN_USER"的session中 session.setAttribute("LOGIN_USER", user); return map; }else{ map.put("msg", "用户名或密码错误!"); } }else{ map.put("msg", "用户名或密码不能为空!"); } }catch(Exception ex){ map.put("msg", "系统出错!"); } return map; }
步骤三:在spring-mvc.xml视图解析器中添加mvc:interceptors拦截器全局配置,它会匹配所有controller类中定义的请求,代码如下:
<!-- 登录拦截器 --> <mvc:interceptors> <bean class="com.voa.english.controller.LoginInterceptor"/> </mvc:interceptors>
步骤四:在controller包下创建LoginInterceptor类,然后继承HandlerInterceptorAdapter类,实现里面的两个方法,代码如下:
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import com.voa.english.model.Users; public class LoginInterceptor extends HandlerInterceptorAdapter{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // TODO Auto-generated method stub return super.preHandle(request, response, handler); } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // TODO Auto-generated method stub //super.postHandle(request, response, handler, modelAndView); //获取当前请求的url String urlStr = request.getRequestURI(); //从session中获取key为“LOGIN_USER”的用户 Users user = (Users)request.getSession().getAttribute("LOGIN_USER"); //如果session中没有user登录用户信息,并且该请求不是login登录跳转请求的话,才会重定向到登录页面 if(user == null && !urlStr.equals("/admin/user/login")){ response.sendRedirect(request.getContextPath()+"/admin/user/login"); } } }
备注:preHandle方法默认返回true,只有返回了true才会进入到postHandle方法,并拦截用户登录信息,做相对应的信息处理。