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的监控实现:
把上面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
3
4
5
6
7
8
9
10
11
12
13
14
过滤器实现类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