需求:
1. 用户请求url;
2. 拦截器进行拦截校验:
如果请求的url是公开地址(无需登陆就能访问的url,比如首页),则放行;
如果用户session不存在,则跳转到登陆页面;
如果用户session存在,则放行,继续操作。
实现:
controller:
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class LoginController {
//登陆
@RequestMapping("/login")
public String login(HttpSession session, String userName, String password) {
//调用service进行...
//将用户身份信息存入session中
session.setAttribute("userName", userName);
return "redirect:/queryItems";
}
//退出(即清除session)
@RequestMapping("/logout")
public String logout(HttpSession session) {
//清除session
session.invalidate();
return "redirect:/queryItems";
}
}
interceptor:
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;
public class LoginInterceptor implements HandlerInterceptor {
//Handler执行完成之后执行
//应用场景:统一异常处理,统一日志处理
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception)
throws Exception {
System.out.println("afterCompletion");
}
//进入Handler之后,返回modelAndView之前执行
//应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception {
System.out.println("postHandle");
}
//进入Handler之前执行
//用于身份认证,身份授权
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//获取请求的url
String url = request.getRequestURI();
//判断url是否是公开地址(实际开发中要将公开地址配置在配置文件中)
//这里公开地址就是登陆页面的地址
if (url.indexOf("login") >= 0) {
return true;//放行
}
//判断session,从session中取得用户身份信息
HttpSession session = request.getSession();
String userName = (String) session.getAttribute("userName");
if (userName != null && userName != "") {
//身份存在,放行
return true;
}
//当代码执行到这里的时候说明用户未登录
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
//return false 表示拦截住,不向下执行
return false;
}
}