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

题目:

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

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

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

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

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

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>用户登录</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/login">
    用户名:<input type="text" name="name"/><br/>
    密码:  <input type="password" name="password"/><br/>
    <input type="submit" value="登录"/>
</form>
</body>
</html>

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

@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域中的用户信息
HttpSession session=request.getSession(); User user= (User)session.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<String, List<String>> map=new HashMap<>(); //角色名 角色拥有的权限 map.put("admin", Arrays.asList("StudentController","IndexController")); map.put("test",Arrays.asList("UserController")); //判断角色与请求的控制层关系 List<String> 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 { } }

四、写一个404.jsp,没有权限的页面;

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>没有权限</title>
</head>
<body>
<h1>对不起!没有权限执行相关操作。</h1>
</body>
</html>

五、到这里呢,我们的脚本工作已经完成了,还需要在springmvc的配置文件中再配置一个角色的拦截器,这里有一点我们需要注意,如果我们在配置文件中配置了多个拦截器的话,拦截器的执行顺序为其配置的先后顺序,配置的前面的先执行;

        <!-- 拦截器的执行顺序为其配置顺序,配置在前面的先执行-->
        <mvc:interceptor>
           <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/login"/>
            <bean id="authorityInterceptor" class="interceptor.AuthorityInterceptor"></bean>
        </mvc:interceptor>

 下面说明一些测试注意的方法:

已有功能

1)登录拦截:如有没有登录,访问其他资源,会跳转到登录页面;

a.在没登录的情况下,访问资源,==》跳转登录页面;

b.登录了,再去访问资源,不会跳转登录页面,能够正常访问;

2)权限控制:如果登录的用户操作其角色拥有的权限,可正常操作,如果操作其角色没有拥有权限,则会跳转到403没有权限页面。

a.Admin ==》StudentController, IndexController中的方法可以访问;

   test==》UserController中的方法可以访问;

b.其他的不能访问 ,直接跳转到403.jsp页面;

 

posted @ 2020-05-28 20:33  等你的夏天  阅读(364)  评论(0编辑  收藏  举报