当我们需要进行用户验证的时候,会使用到springmvc interceptor拦截器判断用户是否登录,如果用户没有正确登录,就需要让用户跳转到登录页面,如果登录,则能正常访问,那么我们该如何使用springmvc拦截器来做这一个功能呢?
springmvc interceptor拦截器和filter过滤器差不多,但是interceptor拦截器只能拦截Controller请求,而filter过滤器功能则更强大一点,本案例需要使用到session域对象来存储用户信息,然后通过自定义springmvc拦截器来拦截URL网址,并判断session里面是否有当前登录用户的信息,下面开始来学习吧!
步骤一:在web.xml文件中设置session过期时间,添加如下代码,session过期时间为20分钟,测试的话可以设置少一点:
20
步骤二:当用户请求controller类中的登录接口的时候,将用户信息存储到session域对象中,代码如下:@PostMapping("user/doLogin")
@ResponseBody
public Map doLogin(HttpSession session,@RequestParam String username,@RequestParam String password){
Map map= new HashMap();
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类中定义的请求,代码如下:
步骤四:在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方法,并拦截用户登录信息,做相对应的信息处理。
来源网站:太平洋学习网,转载请注明出处:http://www.tpyyes.com/a/javaweb/664.html