配置Alibaba druid实践和总结

1 什么是DRUID

Druid是一个JDBC组件,它包括三部分: 

  • DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系。 

  • DruidDataSource 高效可管理的数据库连接池。 

  • SQLParser 


2 Druid可以做什么? 

1) 可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。 

2) 替换DBCPC3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。 

3) 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。 

4) SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-LoggingLog4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。 

扩展JDBC,如果你要对JDBC层有编程的需求,可以通过Druid提供的Filter-Chain机制,很方便编写JDBC层的扩展插件。 

如下是一个基于Druid内置扩展StatFilter的监控实现:


DRUID 在线API地址:http://tool.oschina.net/apidocs/apidoc?api=druid0.26

3 druid 如何在web中配置?

springmvc配置可参考博文: http://www.itnose.net/detail/6167240.html

确保在web.xml添加:

<servlet> 
     <servlet-name>DruidStatView</servlet-name> 
     <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class> 
 </servlet> 
 <servlet-mapping> 
     <servlet-name>DruidStatView</servlet-name> 
     <url-pattern>/druid/*</url-pattern> 
 </servlet-mapping> 
 <filter> 
  <filter-name>druidWebStatFilter</filter-name> 
  <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class> 
  <init-param> 
   <param-name>exclusions</param-name> 
   <param-value>/public/*,*.js,*.css,/druid*,*.jsp,*.swf</param-value> 
  </init-param> 
  <init-param> 
   <param-name>principalSessionName</param-name> 
   <param-value>sessionInfo</param-value> 
  </init-param> 
  <init-param> 
   <param-name>profileEnable</param-name> 
   <param-value>true</param-value> 
  </init-param> 
 </filter> 
 <filter-mapping> 
  <filter-name>druidWebStatFilter</filter-name> 
  <url-pattern>/*</url-pattern> 
 </filter-mapping>

 

把上面servlet配置添加到项目web.xml即可。然后运行Tomcat,浏览器输入 http://IP:PROT/druid

就可以打开Druid的监控页面了.


4 如何设置访问权限?

Druid的jar包中包含了一个自身小型web结构,有java、jsp、js、css等, 通过过滤器拦截/druid/*实现使用 http://IP:PROT/druid访问,如果不设置权限控制,在浏览器中输入此页面地址将会被所有人查看,对于任何一个后台管理员都是无法容忍这种情况发生。


druid本身页面支持用户名和密码配置:https://github.com/cncounter/cncounter/blob/master/cncounter/src/main/webapp/WEB-INF/web.xml

重新配置DruidStatView

 
  <servlet><servlet-name>DruidStatView</servlet-name>
  <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
  <init-param>
  <!-- 允许清空统计数据 -->
  <param-name>resetEnable</param-name>
  <param-value>true</param-value>
  </init-param>
  <init-param>
  <!-- 用户名 -->
  <param-name>loginUsername</param-name>
  <param-value>druid</param-value>
  </init-param>
  <init-param>
  <!-- 密码 -->
  <param-name>loginPassword</param-name>
  <param-value>druid</param-value>
  </init-param>
  </servlet>

但是这样仍然很麻烦,后台管理员在登录系统后还需要二次登录druid,稍显麻烦,如果要简化为登录一次怎么办?

首先保证服务端有管理员的session

在web.xml配上自己的druid过滤器,该过滤器顺序上需要抢在DruidStatView之前。

1         <filter> 

2                <filter-name>UserAdmin<filter-name> 

3            <!--   -->

4                <filter-class>lsweetyy.web.FilterServlet<filter-class> 

5                  

6                <init-param> 

7                      

8                    <param-name>allowRole<param-name> 

9                    <param-value>1<param-value> 

10            <init-param> 

11        <filter> 

12       <filter-mapping> 

13            <filter-name>UserAdmin<filter-name> 

14            <url-pattern>/druid/*<url-pattern> 

    <filter-mapping>


过滤器实现类lsweetyy.web.FilterServlet:


1        public class FilterServletextends HttpServlet implements Filter {  

2            private static final long serialVersionUID= 5162189625393315379L;  

3          

4            private static Logger LOG =Logger.getLogger(FilterServlet.class);  

5          

6            /**

7             * 配置允许的角色

8             */ 

9            private String allowRole = null;  

10      

11        /**

12         * 重定向的URL

13         */ 

14        private String redirectURl = null;  

15      

16        public void init(FilterConfig filterConfig)throws ServletException {  

17            // 得到允许的角色,这个参数是由web.xml里的allowRole所指定 

18            allowRole = filterConfig.getInitParameter("allowRole");  

19            // 指定要重定向的页面 

20            redirectURl ="/locker/index.html";  

21        }  

22      

23        /**

24         * 在过滤器中实现权限控制

25         */ 

26        public void doFilter(ServletRequestsRequest, ServletResponse sResponse,  

27                FilterChain filterChain) throwsIOException, ServletException {  

28            HttpServletRequest request =(HttpServletRequest) sRequest;  

29            HttpServletResponse response =(HttpServletResponse) sResponse;  

30            HttpSession session = request.getSession();  

31      

32            // 如果回话中的用户为空,页面重新定向到登陆页面 

33            if(session.getAttribute(UserAction.CURRENT_USER) == null) {  

34                response.sendRedirect(redirectURl);  

35            }  

36            // 会话中存在用户,则验证用户是否存在当前页面的权限 

37            else {  

38                User user = (User)session.getAttribute(UserAction.CURRENT_USER);  

39                try {  

40                    // 如果用户没有当前页的权限,页面重新定向到登陆页面 

41                    if("0".equals(allowRole) || user.hasPower(allowRole)) {  

42                        filterChain.doFilter(sRequest,sResponse);  

43                    } else {  

44                        // 过滤器经过过滤后,过滤链继续传递请求和响应 

45                        response.sendRedirect(redirectURl);  

46                    }  

47                } catch (Throwable e) {  

48                    LOG.error("权限过滤时候出现错误", e);  

49                    throw newRuntimeException("权限过滤时候出现错误", e);  

50                }  

51            }  

52        }  

53      

54        public void destroy() {  

55        }  

56      

57    }  


附:
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值