简单实用一分钟上手级权限控制

本文介绍了一种简单的权限控制方法,通过自定义过滤器实现对特定URL的权限验证。具体包括检查登录状态、验证用户权限和处理未授权访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单实用一分钟上手级权限控制

用的是通过filter过滤来管理权限的方法, 很简单,但也很实用。 这个项目并不小,但这么一个类就已经可以满足其权限管理的需要了,所以其实很多时候,权限管理大家并不必要想得那么复杂, 对于不少系统,简单通过filter来管理就ok了, simple 也是一种美^_^ 在web.xml里加入

 
  1.     
  2. <!--================权限 设置================-->     
  3. <filter>     
  4.   
  5.     <filter-name>Authentication</filter-name>     
  6.   
  7.     <filter-class>com.springside.demo.security.UrlFilter</filter-class>     
  8.   
  9.     <init-param>     
  10.   
  11.         <param-name>onError</param-name>     
  12.   
  13.         <param-value>/login.jsp</param-value>     
  14.   
  15.     </init-param>     
  16.   
  17. </filter>     
  18.   
  19. <filter-mapping>     
  20.   
  21.     <filter-name>Authentication</filter-name>     
  22.   
  23.     <!-- 只过滤 .jsp 结尾的url, 其余的如 .do, .html, .jpg, .css 等不作过滤-->     
  24.   
  25.     <url-pattern>*.jsp</url-pattern>     
  26.   
  27. </filter-mapping>     
  28.   
  1.     
  2.   
  3. public class UrlFilter implements Filter {       
  4.   
  5.     private FilterConfig filterConfig;      
  6.   
  7.      
  8.   
  9.     private FilterChain chain;      
  10.   
  11.      
  12.   
  13.     private HttpServletRequest request;      
  14.   
  15.      
  16.   
  17.     private HttpServletResponse response;      
  18.   
  19.      
  20.   
  21.     public void destroy() {      
  22.   
  23.         this.filterConfig = null;      
  24.   
  25.     }      
  26.   
  27.      
  28.   
  29.     public void init(FilterConfig filterConfig) throws ServletException {      
  30.   
  31.         this.filterConfig = filterConfig;      
  32.   
  33.     }      
  34.   
  35.      
  36.   
  37.     public void doFilter(ServletRequest servletRequest,      
  38.   
  39.             ServletResponse servletResponse, FilterChain chain)      
  40.   
  41.             throws IOException, ServletException {      
  42.   
  43.         this.chain = chain;      
  44.   
  45.         this.request = (HttpServletRequest) servletRequest;      
  46.   
  47.         this.response = ((HttpServletResponse) servletResponse);      
  48.   
  49.      
  50.   
  51.         String url = request.getServletPath();      
  52.   
  53.         if (url == null)      
  54.   
  55.             url = "";      
  56.   
  57.      
  58.   
  59.         // 获取session中的loginuser对象      
  60.   
  61.         HttpSession session = request.getSession();      
  62.   
  63.         LoginUser loginuser = (LoginUser) session.getAttribute("loginuser");      
  64.   
  65.      
  66.   
  67.         if (baseUrl(url, request)) {      
  68.   
  69.             // 如果是登陆界面等无须权限访问的的公用界面则跳过      
  70.   
  71.             chain.doFilter(request, response);      
  72.   
  73.         } else if (loginuser == null) {      
  74.   
  75.             checkLogin(url);      
  76.   
  77.         } else {      
  78.   
  79.             verifyUrl(url, loginuser);      
  80.   
  81.         }      
  82.   
  83.     }      
  84.   
  85.      
  86.   
  87.     private void checkLogin(String url) throws ServletException, IOException {      
  88.   
  89.         // 如果session中获取不到 loginuser 对象,要不就是session 过期了,要不就是还没登陆。所以返回登陆界面      
  90.   
  91.         // 在登陆后记得把 loginuser 对象置于 session中      
  92.   
  93.      
  94.   
  95.         if (url.indexOf("/index.jsp") >= 0     
  96.   
  97.                 && "login".equals(request.getParameter("act"))) {      
  98.   
  99.             // 获取request中username,password      
  100.   
  101.             String username = request.getParameter("username");      
  102.   
  103.             String password = request.getParameter("password");      
  104.   
  105.             UserDao userDao = new UserDao();      
  106.   
  107.             if (userDao.authUser(username, password)) {      
  108.   
  109.                 LoginUser user = userDao.getUser(username);      
  110.   
  111.                 request.getSession().setAttribute("loginuser", user);      
  112.   
  113.                 verifyUrl(url,user);      
  114.   
  115.                 return;      
  116.   
  117.             }      
  118.   
  119.         }      
  120.   
  121.         response.sendRedirect("login.jsp");      
  122.   
  123.     }      
  124.   
  125.      
  126.   
  127.     private void verifyUrl(String url, LoginUser loginuser)      
  128.   
  129.             throws IOException, ServletException {      
  130.   
  131.         // 获取 loginuser 拥有的所有资源串      
  132.   
  133.         Set royurl = loginuser.getResStrings();      
  134.   
  135.         if (royurl != null && royurl.size() > 0 && pass(royurl, url, request.getParameterMap())) {      
  136.   
  137.             chain.doFilter(request, response);      
  138.   
  139.         } else {      
  140.   
  141.             response.setContentType("text/html;charset=GBK");      
  142.   
  143.             response      
  144.   
  145.                     .getWriter()      
  146.   
  147.                     .println(      
  148.   
  149.                             "<div style='margin: 100 auto;text-align: center;"     
  150.   
  151.                                     + "font: bold 18px 宋体;color: #0066CC;vertical-align: middle'> Sorry,您没有权限访问该资源!</div>");      
  152.   
  153.         }      
  154.   
  155.     }      
  156.   
  157.      
  158.   
  159.     /**    
  160.  
  161.      * 判断是否是公用界面    
  162.  
  163.      */     
  164.   
  165.     protected boolean baseUrl(String url, HttpServletRequest request) {      
  166.   
  167.         if (url.indexOf("/login.jsp") >= 0) {      
  168.   
  169.             return true;      
  170.   
  171.         }      
  172.   
  173.         return false;      
  174.   
  175.     }      
  176.   
  177.      
  178.   
  179.     /**    
  180.  
  181.      * 判断该用户是否有权请求该url    
  182.  
  183.      *     
  184.  
  185.      * @param royurl    
  186.  
  187.      *            user拥有的授权的的url串集合    
  188.  
  189.      * @param url    
  190.  
  191.      *            当前请求的url    
  192.  
  193.      * @param reqmap    
  194.  
  195.      *            当前request的参数    
  196.  
  197.      * @return 是否通过该url    
  198.  
  199.      */     
  200.   
  201.     protected boolean pass(Set royurl, String url, Map reqmap) {      
  202.   
  203.         boolean match = true;      
  204.   
  205.         for (Iterator iter = royurl.iterator(); iter.hasNext();) {      
  206.   
  207.             // 获取资源      
  208.   
  209.             match = true;      
  210.   
  211.             String res_string = (String) iter.next();      
  212.   
  213.             if (res_string.indexOf("*") > 0) {      
  214.   
  215.                 res_string = res_string.substring(0, res_string.indexOf("*"));      
  216.   
  217.                 if (url.substring(0, res_string.length()).equalsIgnoreCase(      
  218.   
  219.                         res_string)) {      
  220.   
  221.                     return true// 增加通配符比较      
  222.   
  223.                 }      
  224.   
  225.             }      
  226.   
  227.             // 分割url与参数      
  228.   
  229.             String[] spw = res_string.split("//?"); // 用"//?" 转义后即可得到正确的结      
  230.   
  231.             if (!url.equalsIgnoreCase(spw[0])) {      
  232.   
  233.                 match = false;      
  234.   
  235.             }      
  236.   
  237.             if (match && spw.length > 1) {      
  238.   
  239.                 String[] spa = spw[1].split("//&"); // 分拆各参数      
  240.   
  241.                 for (int j = 0; j < spa.length; j++) {      
  242.   
  243.                     String[] spe = spa[j].split("="); // 分拆键与值      
  244.   
  245.                     String key = spe[0];      
  246.   
  247.                     String value = "";      
  248.   
  249.                     if (spe.length > 1) {      
  250.   
  251.                         value = spe[1].trim();      
  252.   
  253.                     }      
  254.   
  255.      
  256.   
  257.                     // 轮询      
  258.   
  259.                     String[] values = (String[]) reqmap.get(key);      
  260.   
  261.                     if (values != null) {      
  262.   
  263.                         for (int k = 0; k < values.length; k++) {      
  264.   
  265.                             if (value.equalsIgnoreCase(values[k])) {      
  266.   
  267.                                 match = true;      
  268.   
  269.                                 break;      
  270.   
  271.                             }      
  272.   
  273.                             match = false;      
  274.   
  275.                         }      
  276.   
  277.                         if (!match) {      
  278.   
  279.                             break;      
  280.   
  281.                         }      
  282.   
  283.                     }      
  284.   
  285.                 }      
  286.   
  287.      
  288.   
  289.             }      
  290.   
  291.      
  292.   
  293.             if (match) {      
  294.   
  295.                 break;      
  296.   
  297.             }      
  298.   
  299.         }      
  300.   
  301.         return match;      
  302.   
  303.     }      
  304.   
  305.      
  306.   
  307.     public static void main(String[] args) {      
  308.   
  309.         UrlFilter filter = new UrlFilter();      
  310.   
  311.         String url = "/baseProd/product.do";      
  312.   
  313.      
  314.   
  315.         Map reqmap = new HashMap();      
  316.   
  317.         // 当前请求productline参数是11,12      
  318.   
  319.         reqmap.put("productline"new String[] { "11""12" });      
  320.   
  321.      
  322.   
  323.         String str;      
  324.   
  325.         Set royurl = new HashSet();      
  326.   
  327.      
  328.   
  329.         // 和授权的的url根本不同,false      
  330.   
  331.         royurl.add("/user.do?a=1&b=2");      
  332.   
  333.         System.out.println("match false:" + filter.pass(royurl, url, reqmap));      
  334.   
  335.         // 授权的请求参数13,14时 false      
  336.   
  337.         royurl.add("/baseProd/product.do?productline=13&productline=14");      
  338.   
  339.         System.out.println("match false:" + filter.pass(royurl, url, reqmap));      
  340.   
  341.         // 授权的请求参数11,13时 false      
  342.   
  343.         royurl.add("/baseProd/product.do?productline=11&productline=13");      
  344.   
  345.         System.out.println("match false:" + filter.pass(royurl, url, reqmap));      
  346.   
  347.      
  348.   
  349.         // 授权的请求参数11时 true      
  350.   
  351.         royurl.add("/baseProd/product.do?productline=11");      
  352.   
  353.         System.out.println("match true:" + filter.pass(royurl, url, reqmap));      
  354.   
  355.      
  356.   
  357.         // 参数的不论顺序 true      
  358.   
  359.         royurl.add("/baseProd/product.do?productline=12&productline=11");      
  360.   
  361.         System.out.println("match true:" + filter.pass(royurl, url, reqmap));      
  362.   
  363.      
  364.   
  365.         royurl.clear();      
  366.   
  367.         // 支持 "*" 号作通配符 true      
  368.   
  369.         royurl.add("/baseProd/product.do*");      
  370.   
  371.         System.out.println("match ture:" + filter.pass(royurl, url, reqmap));      
  372.   
  373.      
  374.   
  375.     }      
  376.   
  377.      
  378.   
  379. }     
  380.   
LoginUser 类:
  1.     
  2.   
  3. public class LoginUser {      
  4.     private String name;      
  5.   
  6.           
  7.   
  8.     //用户的授权url集合,如"/product.do?line=1&singer=2","/menu.do?son=1&son=2&son=3","/job.do*"      
  9.   
  10.     private Set resStrings;      
  11.   
  12.      
  13.   
  14.     public String getName() {      
  15.   
  16.         return name;      
  17.   
  18.     }      
  19.   
  20.      
  21.   
  22.     public void setName(String name) {      
  23.   
  24.         this.name = name;      
  25.   
  26.     }      
  27.   
  28.      
  29.   
  30.     public Set getResStrings() {      
  31.   
  32.         return resStrings;      
  33.   
  34.     }      
  35.   
  36.      
  37.   
  38.     public void setResStrings(Set resStrings) {      
  39.   
  40.         this.resStrings = resStrings;      
  41.   
  42.     }      
  43.   
  44.           
  45.   
  46.           
  47.   
  48. }     
  49.  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值