springmvc拦截器用作验证登陆
一、写一个实现了HandlerInterception的类
实现接口中的3个方法,对于这三个方法,简单介绍一下
- preHandle方法:进入Handler方法之前执行。可以用于身份认证、身份授权。比如如果认证没有通过表示用户没有登陆,需要此方法拦截不再往下执行(return false),否则就放行(return true)。
- postHandle方法:进入Handler方法之后,返回ModelAndView之前执行。可以看到该方法中有个modelAndView的形参。应用场景:从modelAndView出发:将公用的模型数据(比如菜单导航之类的)在这里传到视图,也可以在这里同一指定视图。
- afterCompletion方法:执行Handler完成之后执行。应用场景:统一异常处理,统一日志处理等。
那么实现登陆验证我们则需要在preHandle中进行操作,如下
那么这个session中的username什么时候放入喃
public class Interceptor1 implements HandlerInterceptor{
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
// TODO Auto-generated method stub
//当请求去的是登陆页面就直接放行
if(arg0.getRequestURI().contains("login")){
return true;
}
HttpSession session= arg0.getSession();
String username=(String) session.getAttribute("username");
if(username!=null){
return true;
}
//跳转到登陆界面进行登陆
arg0.getRequestDispatcher("/WEB-INF/views/login.jsp").forward(arg0, arg1);
return false;
}
}
二、负责登陆的controller
@Controller
public class LoginController {
@Autowired
private StudentsinfoService studentsinfoService;
@RequestMapping(value="/login")
public String login(HttpServletRequest request,String username,String password){
HttpSession session=request.getSession();
//这里为验证此用户名和密码是否正确,不一定按照这个地方的来写
if(username!=null){
if(studentsinfoService.isStudent(username,password)){
session.setAttribute("username", username);
return "user";
}
String massage="账号或密码错误";
session.setAttribute("massage", massage);
//否则 登录失败 返回登陆页面
return "login";
}
}
三、相应的配置
在springmvc(dispatcherServlet-servlet.xml)中配置
<mvc:interceptor > <mvc:mapping path="/**"/> //代表全部路径 <bean class="com.students.controller.Interceptor1"/> //拦截器的类名 </mvc:interceptor> </mvc:interceptors>
但是这样的话有些静态资源就会加载不到,那我们可以再加点配置配置完成了 现在就可以对其进行登陆验证了<mvc:resources mapping="/resources/**" location="/static/resources" /> <mvc:resources mapping="/static/css/**" location="/static/bootstrap-3.3.7-dist/css/" /> <mvc:resources mapping="/static/images/**" location="/static/images/" /> <mvc:resources mapping="/static/js/**" location="/static/bootstrap-3.3.7-dist/js/" />
四:其他问题
但是这里会有2个问题
1.当前台是ajax传过来的请求的时候拦截器并不能跳转,原因可想而知了,因为ajax是局部的,不管是成功还是失败都会由ajax的的成功或者失败函数的进行处理。
解决这个问题请看我的下一篇博文http://blog.youkuaiyun.com/make__it/article/details/78841070
2.springmvc的拦截器只会拦截对controller的访问,不会拦截对jsp的访问,前端客户还是能直接访问到jsp
可看我的下一篇文章http://blog.youkuaiyun.com/make__it/article/details/78841373