我们现在写最后一步:拦截器。
本文的思路就是用户在访问***.action时那个url是在自己的权限范围内的,不然拦截下来。
用户权限管理是给用户分配好权限之后,用户只能登陆自己的权限,这么去保证呢?那就用用户的url去匹配,看是不是在用户分配的权限范围内。
拦截器思路如下:
我们用的是SpringMvc框架,配置拦截器的方法是写一个类继承HandlerInterception接口,然后里面有三个方法需要复写,然后在springmvc中配置这个拦截器。
如下:
package yycg.base.action.HandlerInterceptor; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.web.bind.annotation.SessionAttributes; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import yycg.base.pojo.vo.ActiveUser; import yycg.base.pojo.vo.Operation; import yycg.base.process.context.Config; import yycg.util.ResourcesUtil; public class PermissionInterceptor implements HandlerInterceptor { /** * * 执行时间:进入到action方法之前, * 使用场景:用于用户的认证,用户的授权拦截。 * */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String url=request.getRequestURI();//得到用户请求的url地址 /* * 判断这个地址是不是公开地址是的话就放行 * */ List<String> open_urls=ResourcesUtil.gekeyList(Config.ANONYMOUS_ACTIONS); for(String open_url:open_urls) { if(url.indexOf(open_url)>=0)//>=0说明找到位置了 { return true; } } //校验是否是公共权限 //获取公共权限 地址 List<String> commonurl_list = ResourcesUtil.gekeyList(Config.COMMON_ACTIONS); //校验请求的url是否在公共权限地址内 for(String common_url:commonurl_list){ if(url.indexOf(common_url)>=0){ return true;//如果是公共权限 地址则放行 } } //是否是用户的操作权限 //从session中拿到用户的操作权限 //获取session HttpSession session = request.getSession(); //用户身份信息 ActiveUser activeUser = (ActiveUser)session.getAttribute(Config.ACTIVEUSER_KEY); List<Operation> operations = activeUser.getOperationList(); //校验请求的url是否在用户操作权限地址内 for(Operation operation_index:operations){ String operation = operation_index.getActionUrl(); if(url.indexOf(operation)>=0){ return true;//如果是用户的操作权限 地址则放行 } } //提示用户无此操作权限 //跳转到无此操作权限操作页面 request.getRequestDispatcher("/WEB-INF/jsp/base/refuse.jsp").forward(request, response); return false; } /** * 执行的时机:进入到Action方法,在返回modelAndView之前执行。 * 使用场景:在这里统一对返回的数据进行处理,比如统一添加菜单,导航等 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
最后在在springmvc.xml中配置权限。
<!-- 用户权限的拦截 --> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="yycg.base.action.HandlerInterceptor.PermissionInterceptor"></bean> </mvc:interceptor>
这样子的话,我们的权限控制就深入到底层了。
不仅局限在菜单上的操作。因为如果只是局限在不同的用户登录,显示的左侧菜单不同这样话。其实用户在url里面直接输入地址还是可以操作别的用户菜单下的具体操作。
但是采取我们这样做的话,就控制到到底层了。你在地址栏上输入一个别人的菜单下的url,但是因为你没有那个权限所以也是不能登录的。