配置Alibaba druid实践和总结

1 什么是DRUID

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

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

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

  • SQLParser 


2 Druid可以做什么? 

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

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

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

4) SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和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添加:

 
     DruidStatView 
     com.alibaba.druid.support.http.StatViewServlet 
 
 
  
     DruidStatView 
     /druid/* 
 
 
  
  druidWebStatFilter 
  com.alibaba.druid.support.http.WebStatFilter 
   
   exclusions 
   /public/*,*.js,*.css,/druid*,*.jsp,*.swf 
  
 
   
   principalSessionName 
   sessionInfo 
  
 
   
   profileEnable 
   true 
  
 
 
 
  
  druidWebStatFilter 
  /* 
 

 

把上面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>DruidStatViewservlet-name>
  <servlet-class>com.alibaba.druid.support.http.StatViewServletservlet-class>
  <init-param>
 
  <param-name>resetEnableparam-name>
  <param-value>trueparam-value>
  init-param>
  <init-param>
 
  <param-name>loginUsernameparam-name>
  <param-value>druidparam-value>
  init-param>
  <init-param>
 
  <param-name>loginPasswordparam-name>
  <param-value>druidparam-value>
  init-param>
  servlet>

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

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

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

1          

2                UserAdmin 

3            

4                lsweetyy.web.FilterServlet 

5                  

6                 

7                      

8                    allowRole 

9                    1 

10             

11         

12        

13            UserAdmin 

14            /druid/* 

   


过滤器实现类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    }  


附:

GitHub项目主页: https://github.com/alibaba/druid

QQ群:  点击链接加入群【阿里开源技术交流】

演示地址: http://cncounter.duapp.com/druid/index.html

常见问题回答请参考: https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98


你可能感兴趣的:(技术备忘录,java,alibaba,mvc)