JFinal使用Druid监控数据问题,不用登录就直接进去

我在使用JFinal时,使用druid作为数据源,而druid本身有个可视化的数据源监控中心。其出现的问题表现为。我配置好后,发现不用登录就直接进入了监控中心界面。而登录就会报错,其configHandler 的配置如下

QQ截图20180423151301.png

如上的配置是能够进入到控制中心,但是我想通过我的web.xml 中的配置的用户名登录与密码进行登录后才可以查看,但是我进入到登录页面,页面如下

QQ截图20180423151951.png

如上的界面是druid的默认登录界面,当我点击登录时候,后台提示我:

java.lang.RuntimeException: java.lang.NullPointerException 空指针异常,如下图所示,

QQ截图20180423152417.png

通过定位,发现是 下图位置所示报出的异常:

QQ截图20180423152454.png

即username 或者password 是null,即应该是web.xml中配置的loginUsername与loginPassword没有初始化成功。所以我想问一下,这个是怎么回事?













评论区

lyh061619

2018-04-23 17:54

不用搞那么麻烦的,用这样方式吧,
/**
* 配置处理器
*/
public void configHandler(Handlers me) {
// Druid监控
DruidStatViewHandler dvh = new DruidStatViewHandler("/druid", new IDruidStatViewAuth() {

@Override
public boolean isPermitted(HttpServletRequest request) {
return true;
}
});
me.add(dvh);
}
(1)、不需要你在web.xml专门配置帐户。
(2)、上面代码中的isPermitted处理下你想要配置的访问权限就完事了。

HingLo

2018-04-24 09:18

@lyh061619 是在这样的,我的是一个前后完全分离的项目,我在请求/druid/index.html 根本就不能携带token,而前后分离也没有用session来维持回话,我在浏览器中我发现,每次的响应cookie都没有jessionid的响应。

shang

2018-05-10 12:25

今天我也发现这个问题了,,应该是username为空。如果在web.xml中配置loginPassword和loginUsername的话,亲测是可以获取到的。理论上这个username在这里应该就是loginUsername的值,同理loginPassword.
1. 在com.alibaba.druid.support.http.ResourceServlet类的initAuthEnv()方法中,可以获取web.xml中配置loginPassword和loginUsername的值。另外,ResourceServlet这个抽象类的 service()方法中有跟报错位置相同的代码,但ResourceServlet类中的46行有`protected String username = null;`username这个属性,所以在这个类中没问题;
2. 同样是这个包下的 StatViewServlet继承了这个ResourceServlet抽象类。
3. com.jfinal.plugin.druid.DruidStatViewHandler类中35行`private StatViewServlet servlet = new JFinalStatViewServlet();`,JFinalStatViewServlet是DruidStatViewHandler的内部类,85行`class JFinalStatViewServlet extends StatViewServlet`显示它继承了com.alibaba.druid.support.http.StatViewServlet类。
4. JFinalStatViewServlet这个内部类overload重载了com.alibaba.druid.support.http.ResourceServlet中的service()方法。然而,ResourceServlet中有username属性,DruidStatViewHandler中并没有username属性,所以118行报错了。
如果没猜错的话,应该是这个原因。。
@JFinal

shang

2018-05-10 12:28

@shang 额,,是重写Overwrite,不是重载Overload。。。

HingLo

2018-05-10 14:19

@shang 话说你怎么解决的?

JFinal

2018-05-10 16:10

@HingLo @HingLo 上面回复中的 @lyh061619 同学给的代码,其中的 isPermitted() 方法中,你 return false 就不让当前用户访问,你 return true 就可以让当前用户访问

如何决定是 return true 还是 return false ,从 HttpServletRequest request 参数中拿到当前用户的身份就可以

HingLo

2018-05-11 09:02

@JFinal 非常感谢,原理我是明白的,就是我后台认证是通过token(jwt 加密用户Id)来认证的,并没有通过session来保持回话,token是放在请求头中的,而浏览器访问/druid/index.html 的时候根本无法携带token。从而导致我无法在 isPermitted() 中得到token信息,也就无法得到他的权限信息。

JFinal

2018-05-11 10:33

@HingLo 从请求头里面获取即可:
request.getHeader(...);

HingLo

2018-05-11 14:08

@JFinal 访问/druid/index.html的时候我根本没办法给它添加header,因为这个url值druid自生就有的,我没办法给它添加认证header

localhost8080

2018-06-25 12:53

我把那个handle重写了直接赋值,测试了下就可以了

热门反馈

扫码入社