配置文件
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;
}