动力节点旗下在线教育品牌  |  咨询热线:400-8080-105 学Java全栈,上蛙课网
首页 > 文章

Spring MVC权限管理机制

08-24 17:26 68浏览
举报 T字号
  • 大字
  • 中字
  • 小字

在谈Spring MVC权限管理机制之前,我们先来通过一个简单的例子了解一下权限的概念:假设一个论坛,注册的用户分为normal用户,manager用户。

对论坛的帖子的操作有:添加,删除,更新,查看,回复

我们规定:normal用户只能:添加,查看,回复;manager用户可以:删除,更新

normal,manager对应的是角色(role);添加,删除,更新等对应的是权限(permission)通过上实们不难出,Spring MVC权限确实用户管理起着非常重要的作用

下面我们为大家详细地介绍Spring MVC权限管理机制:

一、DispatcherServlet

    SpringMVC具有统一的入口DispatcherServlet,所有的请求都通过DispatcherServlet。

    DispatcherServlet是前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据某某规则分发到目标Controller来处理。  所以我们现在web.xml中加入以下配置:

 

     

     springMybatis  

     org.springframework.web.servlet.DispatcherServlet  

     1  

     

     

     springMybatis  

       

     /  

     

二、静态资源不拦截

    如果只配置拦截类似于*.do格式的url,则对静态资源的访问是没有问题的,但是如果配置拦截了所有的请求(如我们上面配置的“/”),就会造成js文件、css文件、图片文件等静态资源无法访问。

      一般实现拦截器主要是为了权限管理,主要是拦截一些url请求,所以不对静态资源进行拦截。要过滤掉静态资源一般有两种方式,

       第一种是采用,(一般Web应用服务器默认的Servlet名称是"default",所以这里我们激活Tomcat的defaultServlet来处理静态文件,在web.xml里配置如下代码即可:)

 

 

 

    default  

    /js/*  

    /css/*  

    /images/*  

    /fonts/*  

 

        Tomcat, Jetty, JBoss, and GlassFish  默认 Servlet的名字 -- "default"

        Resin 默认 Servlet的名字 -- "resin-file"

        WebLogic 默认 Servlet的名字  -- "FileServlet"

        WebSphere  默认 Servlet的名字 -- "SimpleFileServlet"

       如果你所有的Web应用服务器的默认Servlet名称不是"default",则需要通过default-servlet-name属性显示指定:

 

      第二种是采用,在springmvc的配置文件中加入以下代码:

   

   

 

三、自定义拦截器

    SpringMVC的拦截器HandlerInterceptorAdapter对应提供了三个preHandle,postHandle,afterCompletion方法。preHandle在业务处理器处理请求之前被调用,

    postHandle在业务处理器处理请求执行完成后,生成视图之前执行,afterCompletion在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。所以要想实现自己的权限管理逻辑,需要继承HandlerInterceptorAdapter并重写其三个方法。

    首先在springmvc.xml中加入自己定义的拦截器我的实现逻辑CommonInterceptor,

 

   

        

          

          

          

          

            

      

      

 

    我的拦截逻辑是“在未登录前,任何访问url都跳转到login页面;登录成功后跳转至先前的url”,具体代码如下:

/**

 *  

 */  

package com.alibaba.interceptor;  

import javax.servlet.http.HttpServletRequest;  

import javax.servlet.http.HttpServletResponse;  

import org.slf4j.Logger;  

import org.slf4j.LoggerFactory;  

import org.springframework.web.servlet.ModelAndView;  

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;  

  

import com.alibaba.util.RequestUtil;  

    

/**

 */  

public class CommonInterceptor extends HandlerInterceptorAdapter{  

    private final Logger log = LoggerFactory.getLogger(CommonInterceptor.class);  

    public static final String LAST_PAGE = "com.alibaba.lastPage";  

    /*

     * 利用正则映射到需要拦截的路径     

      

    private String mappingURL;

     

    public void setMappingURL(String mappingURL) {     

               this.mappingURL = mappingURL;     

    }    

  */  

    /**  

     * 在业务处理器处理请求之前被调用  

     * 如果返回false  

     *     从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链

     * 如果返回true  

     *    执行下一个拦截器,直到所有的拦截器都执行完毕  

     *    再执行被拦截的Controller  

     *    然后进入拦截器链,  

     *    从最后一个拦截器往回执行所有的postHandle()  

     *    接着再从最后一个拦截器往回执行所有的afterCompletion()  

     */    

    @Override    

    public boolean preHandle(HttpServletRequest request,    

            HttpServletResponse response, Object handler) throws Exception {    

        if ("GET".equalsIgnoreCase(request.getMethod())) {  

            RequestUtil.saveRequest();  

        }  

        log.info("==============执行顺序: 1、preHandle================");    

        String requestUri = request.getRequestURI();  

        String contextPath = request.getContextPath();  

        String url = requestUri.substring(contextPath.length());  

        

        log.info("requestUri:"+requestUri);    

        log.info("contextPath:"+contextPath);    

        log.info("url:"+url);    

          

        String username =  (String)request.getSession().getAttribute("user");   

        if(username == null){  

            log.info("Interceptor:跳转到login页面!");  

            request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);  

            return false;  

        }else  

            return true;     

    }    

    

    /**

     * 在业务处理器处理请求执行完成后,生成视图之前执行的动作    

     * 可在modelAndView中加入数据,比如当前时间

     */  

    @Override    

    public void postHandle(HttpServletRequest request,    

            HttpServletResponse response, Object handler,    

            ModelAndView modelAndView) throws Exception {     

        log.info("==============执行顺序: 2、postHandle================");    

        if(modelAndView != null){  //加入当前时间    

            modelAndView.addObject("var", "测试postHandle");    

        }    

    }    

    

    /**  

     * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等   

     *   

     * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()  

     */    

    @Override    

    public void afterCompletion(HttpServletRequest request,    

            HttpServletResponse response, Object handler, Exception ex)    

            throws Exception {    

        log.info("==============执行顺序: 3、afterCompletion================");    

    }    

  

}    

至此,拦截器已经实现直接访问/test/hello,会被拦截登录成功后会跳转至/test/hello对应的页面

看完了本文我们不难理解Spring MVC权限管理机制主要依靠前置控制器,自定义拦截器以及静态资源不拦截的策略。一个框架和系统的权限管理是其根基所在,做好了既能体现系统的优势也能体现个人的技术能力,所以我们值得花费更多的精力和时间去学习这方面的知识,也可以观看本站的Spring MVC视频教程,让你玩转Spring MVC权限管理

0人推荐
共同学习,写下你的评论
0条评论
爱读书的姑娘
程序员爱读书的姑娘

12篇文章贡献56281字

作者相关文章更多>

推荐相关文章更多>

DOM渲染的详细过程

QCode09-04 14:38

CSS水平和垂直居中技巧大梳理

Code大师09-04 14:50

mui的input框在IOS系统下无法聚焦或点击多次才能聚焦

不写代码你养我啊08-23 11:14

推荐的-视.频播放器以及在线客服

不写代码你养我啊09-17 18:02

谈谈java多线程的三大特性

要学习了06-18 18:13

发评论

举报

0/150

取消