SpringMVC拦截器应用--------登陆认证

核心:拦截器、过滤器等都是AOP编程思想的一种体现

一、有一个登录页面:login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<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">
用户名:<input type="text" name="username" /><br>
密码:<input type="password" name="password" /><br>
<input type="submit">
</form>
</body>
</html>

二、登录页面有一提交表单的动作,需要在controller中处理:UserController

  1. 判断用户名密码是否正确
  2. 如果正确 向session中写入用户信息
  3. 返回登录成功,或者跳转到商品列表
package com.itheima.springmvc.controller;

import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * 用户登陆
 * @author cyn
 *
 */
@Controller
@RequestMapping("user")
public class UserController {
        
        //跳转到登陆界面
	@RequestMapping("toLogin")
	public String toLogin(){
		return "login";
	}
	
        //跳转至商品列表主界面
	@RequestMapping("login")
	public String login(String username,String password,HttpSession session){
		
                //调用service进行用户的验证
		//模拟登陆成功
		if(username.equals("admin")){
                        //在session中保存用户信息
                        //实际写法:session.setAttribute("user", user);
			session.setAttribute("username", username);
                        //重定向到主界面
			return "redirect:/item/itemList.action";
		}
		//登陆失败返回重新登陆
		return "login";
	}
}

三、拦截器

  1. 拦截用户请求,判断用户是否登录
  2. 如果用户已经登录。放行
  3. 如果用户未登录,跳转到登录页面。
  • 拦截器编码实现:LoginInterceptor
package com.itheima.springmvc.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/**
 * 登录认证拦截器
 * @author cyn
 *
 */
public class LoginInterceptor implements HandlerInterceptor {
	
	//进入Handler方法之前执行
	//用于登陆认证、权限校验等
	//比如登陆认证,如果认证不通过表示当前用户没有登陆,需要此方法拦截不再向下执行
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
		//判断用户有没有登录
		//实际写法:User user = request.getSession().getAttribute("user");
		Object object = request.getSession().getAttribute("username");
		//如果用户未登陆,则直接跳转到登陆页面(或者返回false,限制用户接下来的操作)
		if(object == null){
			//重定向到登陆界面
			response.sendRedirect(request.getContextPath() + "/user/toLogin.action");
		}
		//否则用户已经登陆返回true,直接放行
		//注意:true放行,false拦截
		return true;
	}

	//执行Handler完成执行此方法
	//应用场景:统一异常处理,统一日志处理
	@Override
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
	}

	//进入Handler方法之后,返回modelAndView之前执行
	//应用场景从modelAndView出发:将共用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图
	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {
	}

}
  • 在springmvc的核心配置文件中配置拦截器:
        <!-- 配置拦截器  -->
	<mvc:interceptors>
		<!-- 如果配置多个拦截器,则顺序执行 -->
               	<!-- 配置登陆认证拦截器 -->
		<mvc:interceptor>
			<!-- /**拦截所有请求,包括二级以上目录 -->
			<mvc:mapping path="/**"/>
			<!-- 配置不拦截的url:包括跳转登陆、密码修改、注册等不需要用户登陆的主界面 -->
			<mvc:exclude-mapping path="/user/**"/>
			<bean class="com.itheima.springmvc.interceptor.LoginInterceptor" />
		</mvc:interceptor>
	</mvc:interceptors>

猜你喜欢

转载自blog.csdn.net/qq_37230121/article/details/83782789
今日推荐