SpringMVC实现用户登录拦截器

拦截器

拦截器的主要作用是拦截用户的请求,并作出相应的处理

 

HandlerInterceptor接口

SpringMVC中的Interceptor拦截器拦截请求主要是通过实现HandlerInterceptor接口来实现的。当然也可以继承抽象类HandlerInterceptorAdapter。

 

HandlerInterceptor接口中定义了三个方法,SpringMVC就是通过这三个方法来对用户进行拦截处理的。

boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)。

顾名思义,该方法将在请求处理之前被调用。SpringMVC中的Interceptor实行的是链式调用,即在一个应用中或者说在一个请求中可以同时存在多个Interceptor。每个Interceptor的调用会依据它的声明顺序依次执行,而且最先执行的是Interceptor的preHandle方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。该方法的返回值是布尔值Boolean 类型的,当它返回为false 时,表示请求结束,后续的Interceptor 和Controller 都不会再执行;当返回值为true 时就会继续调用下一个Interceptor 的preHandle 方法,如果已经是最后一个Interceptor 的时候就会是调用当前请求的Controller 方法。

 

void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView)

这个方法在当前请求进行处理之后,也就是Controller 方法调用之后执行,但是它会在DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。postHandle 方法被调用的方向跟preHandle 是相反的,也就是说先声明的Interceptor 的postHandle 方法反而会后执行。

 

void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)

顾名思义,该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的。

 

注意,只有当前所属的Interceptor的preHandle方法的返回值为true才会执行postHandle和afterCompletion方法

 

示例-SpringMVC模拟用户登录拦截器

  • 写一个登录界面 login.jsp ,用于用户登录
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>用户登录</title>
    </head>
    <body>
    <form action="${pageContext.request.contextPath }/user/login.action" method=”post”>
    用户名:<input type="text" name="username" /><br>
    密码:<input type="password" name="password" /><br>
    <input type="submit">
    </form>
    </body>
    </html>
    

     

  • 写UserController用户控制器访问页面
    @Controller
    @RequestMapping("user")
    public class UserController {
    	
    	/**
    	 * 跳转登录界面
    	 * @return
    	 */
    	@RequestMapping("toLogin")
    	public String toLogin() {
    		return "login";
    	}
    	
    	/**
    	 * 登录
    	 * @param username
    	 * @param password
    	 * @param session
    	 * @return
    	 */
    	@RequestMapping("login")
    	public String login(String username,String password,HttpSession session) {
    		String result = "login";
    		//模拟登录
    		//用户存在,允许登录,跳转到相应的界面
    		if (username != null && username.length() > 0) {
    			session.setAttribute("user", username);
    			result = "redirect:/itemList.action";
    		}
    		return result;
    	}
    }
    

     

  • 创建一个登录拦截器
    public class loginInterceptor implements HandlerInterceptor {
    
    	@Override
    	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
    			throws Exception {
    		
    		HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    	}
    
    	@Override
    	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
    			ModelAndView modelAndView) throws Exception {
    		
    		HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    	}
    
    	@Override
    	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
    			throws Exception {
    		Object obj = request.getSession().getAttribute("user");
            //用户已存在,则放行,否则拦截
    		if (obj != null) {
    			//放行,执行处理器
    			return true;
    		}else {
    			response.sendRedirect(request.getContextPath() + "/user/tologin.action");
    			//拦截
    			return false;
    
    		}
    	}
    
    }
    

     

  • 配置拦截器,在SpringMVC的配置文件里添加拦截器的配置
    	<!-- 登录拦截器 -->
    		<mvc:interceptor>
    			<!-- path配置</**>拦截所有请求,包括二级以上目录,</*>拦截所有请求,不包括二级以上目录 -->
    			<mvc:mapping path="/**"/>
    			<!-- 配置不拦截请求的地址 -->
    			<!-- <mvc:exclude-mapping path="/user/toLogin.action"/>
    			<mvc:exclude-mapping path="/user/login.action"/> -->
    			<mvc:exclude-mapping path="/user/*"/>
    			<!-- 注册bean -->
    			<bean class="com.gpnu.ssm.interceptor.loginInterceptor" />
    		</mvc:interceptor>
    

     

    完成

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值