ssm框架中登录拦截器的实现(S_6)

配置文件

springMVC作为控制器,是能控制网页的访问的,我们在springMvc的xml文件中配置关于过滤器的信息

在这里插入图片描述

实现的类

在上面的配置文件中,我们可以看到,我们的过滤器过滤的是admin下的和system下的界面,在这个两个目录下的,有登录,获取验证码以及获取静态资源是不过滤的,bean中放的是我们要实现的类,注意路径,命名,全部都要一致,接下来是创建这个类,在这个类中实现过滤器的逻辑层。

创建一个类,并实现过滤器的接口
在这里插入图片描述

在springMVC的interceptor中,可以放多个拦截器,这里截取的是后台的拦截器,过滤分请求之后,请求的时候和请求之前,每次我们访问新的页面,过滤器页面都会被这个过滤器过滤一遍,如同看电影,我们要在门口等人,之后检票,返回的是true,代表的是我们的票是有效的,这样才能进去看电影。

@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
		String requestURI=request.getRequestURI();//获取请求访问的页面的路径
		Object admin = request.getSession().getAttribute("admin");
		System.out.println("链接"+requestURI+"进入拦截器!");
		if (admin==null) {
			//表示未登陆,或者登陆失效
			//表示是普通链接跳转,直接重定向到登录页面
			response.sendRedirect(request.getServletContext().getContextPath() + "/system/login");
			return false;
		}
		return true;
	}

简单的写了一个例子,为什么要判断admin是否为空呢,看这里,在控制器的实现类中,我们有一个方法,这个方法的本质是做为视图分发的,同样也有登录的时候的逻辑处理,在这个类的最后的一点代码是这样写的,如果我们的逻辑处理都没问题了,我们就进行页面的转发,并且转发的时候是带有登录的时候的这个用户的用户信息的,并且这个用户信息被塞进去的时候被命名为admin,如果我们想要获取这个用户信息,就用admin这个标识来寻找。因此,我们如果是通过合法的路径来访问主页的,那么我们一定会产生这样的一个登录信息,反之,如果这个登录信息是空的,那么,我们的过滤器就认定本次的登录是不合法的,请回到登录的界面进行登录。

在这里插入图片描述
部分代码如下

/**
	 * 登录表单提交处理,返回的是一个json类型的值
	 * @param user
	 * @param cpacha
	 * @return
	 */
	@RequestMapping(value="/login",method=RequestMethod.POST)
	//这里的user是从容器中拿出来的,容器会自动把前台传的值塞进这个容器,一定要注意命名的一致性
	@ResponseBody//意思是返回的时候只返回一个JSON字符串
	public Map<String,String> loginAct(User user,String cpacha
			//上面两个变量都是界面传过来的下面这个变量,是用来获取界面塞进服务器的值的
			,HttpServletRequest request){
		Map<String, String> ret=new HashMap<String,String>();
		if (user==null) {
			ret.put("type", "error");
			ret.put("msg", "请填写用户信息");
			return ret;
		}
		if(StringUtils.isEmpty(cpacha)){
			ret.put("type", "error");
			ret.put("msg", "请填写验证码");
		}
		if(StringUtils.isEmpty(user.getUsername())){
			ret.put("type", "error");
			ret.put("msg", "请填写用户名!");
			return ret;
		}
		if(StringUtils.isEmpty(user.getPassword())){
			ret.put("type", "error");
			ret.put("msg", "请填写密码!");
			return ret;
		}
		Object loginCpacha = request.getSession().getAttribute("loginCpacha");
		if(loginCpacha == null){
			ret.put("type", "error");
			ret.put("msg", "会话超时,请刷新页面!");
			return ret;
		}
		if(!cpacha.toUpperCase().equals(loginCpacha.toString().toUpperCase())){
			ret.put("type", "error");
			ret.put("msg", "验证码错误!");
			return ret;
		}
		
		User findByUsername=userService.findByUsername(user.getUsername());
		if (findByUsername==null) {
			ret.put("type", "error");
			ret.put("msg", "该用户名不存在");
			return ret;
		}
		if (!user.getPassword().equals(findByUsername.getPassword())) {
			ret.put("type", "error");
			ret.put("msg", "密码错误");
			return ret;
		}
		//相当于把这个放在了全局变量里面
		request.getSession().setAttribute("admin", findByUsername);
		ret.put("type", "success");
		ret.put("msg", "登录成功");
		return ret;
	}

这里只是放了部分的代码,由于是用ssm框架写的,逻辑还是比较复杂的,不可能把所有的逻辑讲清楚,更不可能放这个项目的所有的代码,因此,只是在这里总结了一下ssm框架中的过滤器是怎么实现的,简单的写了个小的例子,当然,真正的实现,还需要在过滤器的实现类中加更多的代码的,只是判断admin是否为空,这一点是远远不够的。

下面放一个已经写完的成品
//在请求之前做,下面的return true代表的是可以正常访问

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
		Object arg2) throws Exception {
	String requestURI = request.getRequestURI();
	Object admin = request.getSession().getAttribute("admin");
	if(admin == null){
		//表示未登录或者登录失效
		System.out.println("链接"+requestURI+"进入拦截器!");
		String header = request.getHeader("X-Requested-With");
		//判断是否是ajax请求
		if("XMLHttpRequest".equals(header)){
			//表示是ajax请求,ajax的使用就是不想刷新整个页面,所以我们不用重定向,只用返回ajax需要的判断信息
			Map<String, String> ret = new HashMap<String, String>();
			ret.put("type", "error");
			ret.put("msg", "登录会话超时或还未登录,请重新登录!");
			response.getWriter().write(JSONObject.fromObject(ret).toString());
			return false;
		}
		//表示是普通链接跳转,直接重定向到登录页面
		response.sendRedirect(request.getServletContext().getContextPath() + "/system/login");
		return false;
	}
	//获取菜单id
	String mid = request.getParameter("_mid");
	if(!StringUtils.isEmpty(mid)){
		List<Menu> allThirdMenu = MenuUtil.getAllThirdMenu((List<Menu>)request.getSession().getAttribute("userMenus"), Long.valueOf(mid));
		request.setAttribute("thirdMenuList", allThirdMenu);
	}
	return true;
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值