拦截器实现权限校验

拦截器实现权限校验

  • 案例流程
  • 界面设计(注册页面、登陆界面)
  • 声明式数据校验器的应用
  • 拦截器实现权限校验
  • 编码过滤器的应用

案例流程

声明式数据校验器的应用

/**
 * 用户数据模型:用于校验的对象
 *
 */
public class UserModel {
  @NotBlank(message="用户姓名不能为空")
  private String userName;
  @NotBlank(message="登录名不能为空")
  @Length(min=3,max=16,message="登录名长度需要在3到16位之间")
  private String loginName;
  @NotBlank(message="密码能为空")
  @Length(min=3,max=16,message="密码长度需要在3到16位之间")
  private String password;
  //用户角色只允许选择,不允许输入,因此不需要数据校验
  private String userRole;

	//省略getter、setter方法
  @Override
  public String toString() {
    return "UserModel [userName=" + userName + ",loginName=" + loginName + ",password=" + password + "]";
  }
}

配置文件 

注册控制器

@Controller
@RequestMapping("/user")
public class RegisterController {

  //跳转页面的方法
  @RequestMapping("/toRegPage.do")
  public String toRegPage() {
    return "register";
  }

  //处理注册的方法
  @RequestMapping("/doReg.do")
  public String doReg(@Valid @ModelAttribute("user") UserModel user,Errors errors) {
    //判断数据校验是否成功
    if(errors.hasErrors()) {//判断是否存在数据校验的错误信息
      //数据校验失败,返回到注册页面并显示错误信息
      return "register";
    }
    //数据校验成功
    //1.存储用户信息
    Map<String, Object> userDb = DbUtils.USER_DB;
    //userDb的key:登录名+"_"+密码
    String key = user.getLoginName() + "_" + user.getPassword();
    userDb.put(key, user);
    //2.返回到登录页面
    System.out.println("这是用户信息" + user.toString());
    return "login";
  }
}

用户登陆控制器

@Controller
@RequestMapping("/user")
public class LoginController {

  //跳转登录页面的方法
  @RequestMapping("/toLoginPage.do")
  public String toLoginPage() {
    return "login";
  }

  //处理用户登录
  @RequestMapping("/login.do")
  public String login(UserModel user,Model model,HttpServletRequest request) {
    //1.使用登录名和密码进行用户身份的验证,即去USERDB中获取key
    //2.如果用户不存在,返回登录页面并提示错误信息
	  //3.登录成功,将当前用户信息存储到session中
    //判断用户是否登录成功
    if(null == user) {
      model.addAttribute("errMsg", "请输入登陆信息");
      return "login";
    }
    if(null != user.getLoginName()&& !"".equals(user.getLoginName())&&null != user.getPassword()&& !"".equals(user.getPassword())) {
      //根据数据库的规则通过key获取用户
      String userKey = user.getLoginName() + "_" + user.getPassword();
      UserModel targUser = (UserModel) DbUtils.USER_DB.get(userKey);
      if(null != targUser) {
        //登录成功,将当前用户信息存储到session中
        request.getSession().setAttribute("user", targUser);
        return "menu";
      }else {
        //登录失败,返回登录页面并提示错误信息
        model.addAttribute("errMsg","登录名或密码不正确");
        return "login";
      }
    }else {
      model.addAttribute("errMsg", "请输入登陆信息");
      return "login";
    }
  }
}

内容控制器

@Controller
@RequestMapping("/content")
public class ContentController {

  //普通用户页面的跳转
  @RequestMapping("/toNormal.do")
  public String toNormal() {
    return "normal";
  }

  //高级用户页面的跳转
  @RequestMapping("/toVip.do")
  public String toVip() {
    return "vip";
  }
  //管理员用户页面的跳转
  @RequestMapping("/toAdmin.do")
  public String toAdmin(Model model) {
    //将所有用户信息取出兵显示到管理员界面
    Map<String,Object> userMap = 	DbUtils.USER_DB;
    Iterator<Entry<String, Object>> it = userMap.entrySet().iterator();

    //将所有用户信息存储到userList中,用于在前台展示
    List<UserModel> userList = new ArrayList<UserModel>();
    while(it.hasNext()) {
      Entry<String, Object> entry = it.next();
        userList.add((UserModel) entry.getValue());		
    }
    model.addAttribute("userList",userList);
    return "admin";
  }
}

权限拦截器

public class AuthInterceptor implements HandlerInterceptor{

  @Override
  public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {

	}

  @Override
  public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {

	}
  //控制器处理请求之前执行
  //返回值为 false,截断请求
  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception {
    //1.判断用户是否登录,如果已经登录,则继续执行权限校验,否则返回登录页面,提示错误信息
    UserModel currentUser = (UserModel) request.getSession().getAttribute("user");
    response.setContentType("text/html; charset=utf-8");
    if(null == currentUser) {
      //用户没有登录,直接返回登录页面并且提示错误信息
      response.getWriter().print("请先登录");
      return false;
    }else {
      //用户已经登录
      //判断用户请求的访问路径是什么
      String requestURI = request.getRequestURI();

      //判断是否是普通用户访问相应权限页面
      if(currentUser.getUserRole().equals("normal")&&requestURI.contains("toNormal")) {
        return true;
      //判断是否是高级用户访问相应权限页面
      }else if(currentUser.getUserRole().equals("vip")&&requestURI.contains("toVip")) {
        return true;
      //判断是否是管理员用户访问相应权限页面
      }else if(currentUser.getUserRole().equals("admin")&&requestURI.contains("toAdmin")) {
        return true;
      }else {
        //提示错误信息
        //用户没有登录,直接返回登录页面并且提示错误信息
        response.getWriter().print("当前用户无权限访问该页面");
        return false;
      }
    }
  }
}

编码过滤器

配置权限拦截器

你可能感兴趣的:(拦截器实现权限校验)