springmvc拦截器问题之通过角色名来取对应的方法

2021-01-04 11:29

阅读:418

YPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">

标签:mit   handler   用户数   object   index   except   body   ESS   信息   

题目:

编写一个拦截器,在拦截器中获取登录用户的角色名,

如果角色名为admin,则允许操作StudentController的方法;

如果角色名为test,则允许操作UserController的方法;

如果没有权限,则跳转到一个特定的jsp页面,提示权限不足;

一、先写一个显示在浏览器端的登录页面;

"text/html;charset=UTF-8" language="java" isELIgnored="false" %>用户登录
"${pageContext.request.contextPath}/login"> 用户名:"text" name="name"/>
密码: "password" name="password"/>
"submit" value="登录"/>

二、再写一个控制层的业务逻辑;

@Controller
public class IndexController {
    @RequestMapping("/login")
    public String login(String name, String password, HttpSession session){
        System.out.println("获取到前台数据:name="+name+",password="+password);
        //todo 查询数据库,验证是否存在用户数据
        User user=new User();
        user.setName(name);

        Role role=null;
        if ("admin".equals(name)){
            role=new Role("admin",1);
        }else if ("test".equals(name)){
            role=new Role("test",2);
        }
        user.setRole(role);

        if (user==null){//如果用户不存在,跳回登录页面
            return "login.jsp";
        }
        //登录成功,将用户信息放入session
        session.setAttribute("user",user);
        return "index.jsp";
    }
}

三、最后写一个用户的权限拦截器;

//用户权限拦截器
public class AuthorityInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获取到session域中的用户信息
        User user= (User) request.getSession().getAttribute("user");
        //获取角色信息
        Role role=user.getRole();
        if (role!=null){
            //获取当前的请求的Controller
            String controllerName="";
            if (handler instanceof HandlerMethod) {
                HandlerMethod method = (HandlerMethod) handler;
                //获取当前控制层的名字
                controllerName = method.getBeanType().getSimpleName();
            }
            Map> map=new HashMap();
            //角色名  角色拥有的权限
            map.put("admin", Arrays.asList("StudentController","IndexController"));
            map.put("test",Arrays.asList("UserController"));
            //判断角色与请求的控制层关系
            List list=map.get(role.getName());
            if (list!=null&&list.contains(controllerName)){
                return true;
            }
        }
        response.sendRedirect(request.getContextPath()+"/403.jsp");
        return false;
    }

    @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的配置文件中再配置一个角色的拦截器,这里有一点我们需要注意,如果我们在配置文件中配置了多个拦截器的话,拦截器的执行顺序为其配置的先后顺序,配置的前面的先执行;

        
        "/**"/>
            "/login"/>
            "authorityInterceptor" class="interceptor.AuthorityInterceptor">

 

springmvc拦截器问题之通过角色名来取对应的方法

标签:mit   handler   用户数   object   index   except   body   ESS   信息   

原文地址:https://www.cnblogs.com/xie-qi/p/12983731.html


评论


亲,登录后才可以留言!