springmvc拦截器用作验证登陆

springmvc拦截器用作验证登陆

 一、写一个实现了HandlerInterception的类

 实现接口中的3个方法,对于这三个方法,简单介绍一下

  1. preHandle方法:进入Handler方法之前执行。可以用于身份认证、身份授权。比如如果认证没有通过表示用户没有登陆,需要此方法拦截不再往下执行(return false),否则就放行(return true)。
  2. postHandle方法:进入Handler方法之后,返回ModelAndView之前执行。可以看到该方法中有个modelAndView的形参。应用场景:从modelAndView出发:将公用的模型数据(比如菜单导航之类的)在这里传到视图,也可以在这里同一指定视图。
  3. afterCompletion方法:执行Handler完成之后执行。应用场景:统一异常处理,统一日志处理等。
那么实现登陆验证我们则需要在preHandle中进行操作,如下
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;
		
		
	}

}

那么这个session中的username什么时候放入喃

二、负责登陆的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.csdn.net/make__it/article/details/78841070

2.springmvc的拦截器只会拦截对controller的访问,不会拦截对jsp的访问,前端客户还是能直接访问到jsp

可看我的下一篇文章http://blog.csdn.net/make__it/article/details/78841373

   

 

猜你喜欢

转载自blog.csdn.net/make__it/article/details/78840576