刚开始工作的时候,我的学习工作笔记是记在本子上的,然后移到有道云笔记,大概在第二年的时候转移到CSDN博客,在那上面开始我的技术博客生涯。
一些知识点太久不用就会忘记,在博客上写下来,也是一个很不错的知识整理,还能给别人提供帮助。
工作以来就一直希望能有自己的网站,刚开始是因为技术水平不够,不知道如何下手,后来水平够了,我对搭建自己的个人网站又没有之前那么的有热情了
自己写一个吧,还是要花点时间,其实我还是太懒了,这事就一直这么耽搁下来了。
直到前两天,不知怎么就看到了丁亮的博客,被他首页GitHub 上 Star 数最多的 Java 博客 Solo 给吸引了,从github上把solo的代码拉下来,本地部署一跑,
这不正是我需要的功能嘛,完全覆盖我的需求,花一天时间测试以后,我搭建自己博客的热情又燃烧起来了,说干就干,域名早就买好放在那半年了,先借用公司的
服务器,部署上线。
谁想部署到服务器后测试出问题了,我采用的是nginx+tomcat的集群部署方案,部署到服务器后,测试发现有功能的请求链接403了,删除功能、编辑功能都不能用,
想看日志,发现solo的日志只配置了在控制台输出,太不科学了,算了后面再给他加上log文件输出,先从tomcat的日志里看,发现程序并没有报错,那就只能看代码了,
找到删除的请求目标执行方法,代码如下
/**
* Removes an article by the specified request.
*
* <p>
* Renders the response with a json object, for example,
* <pre>
* {
* "sc": boolean,
* "msg": ""
* }
* </pre>
* </p>
*
* @param context the specified http request context
* @param request the specified http servlet request
* @param response the specified http servlet response
* @param articleId the specified article id
* @throws Exception exception
*/
@RequestProcessing(value = "/console/article/{articleId}", method = HTTPRequestMethod.DELETE)
public void removeArticle(final HTTPRequestContext context, final HttpServletRequest request, final HttpServletResponse response,
final String articleId) throws Exception {
if (!userQueryService.isLoggedIn(request, response)) {
response.sendError(HttpServletResponse.SC_FORBIDDEN);
return;
}
final JSONRenderer renderer = new JSONRenderer();
context.setRenderer(renderer);
final JSONObject ret = new JSONObject();
renderer.setJSONObject(ret);
try {
if (!articleQueryService.canAccessArticle(articleId, request)) {
ret.put(Keys.STATUS_CODE, false);
ret.put(Keys.MSG, langPropsService.get("forbiddenLabel"));
return;
}
articleMgmtService.removeArticle(articleId);
ret.put(Keys.STATUS_CODE, true);
ret.put(Keys.MSG, langPropsService.get("removeSuccLabel"));
} catch (final Exception e) {
LOGGER.log(Level.ERROR, e.getMessage(), e);
final JSONObject jsonObject = new JSONObject();
renderer.setJSONObject(jsonObject);
jsonObject.put(Keys.STATUS_CODE, false);
jsonObject.put(Keys.MSG, langPropsService.get("removeFailLabel"));
}
}
在方法体开头的时候(userQueryService.isLoggedIn(request, response))做了登录验证,这里再吐下槽,登录验证不应该提取出来么,在每个方法中都写一遍我也是醉了,
这里最有可能返回403,果断加log,看是否是因为session丢失导致的通不过登录验证,最后发现请求根本没有进入到这个方法里面来,而是在这之前就被拦截了,但是solo的权限过滤器
并没有拦截删除请求,那就只有org.b3log.latke.servlet.DispatcherServlet这个solo使用的开源框架latke有可能了,但是这是框架的控制器,不太可能做这事啊,因为框架本地测试
是没有问题的,那我只能怀疑是nginx+tomcat的问题了,于是我绕过nginx,直接访问tomcat的端口,测试居然通过了,没有再报403,那就是nginx的问题了,仔细一看nginx的配置
并没有发现什么问题,之前其他的项目都是这么配置的啊,难道是latke框架不支持?觉得不应该啊,只能继续用排除法了,将nginx最有可能的请求过滤注释掉,如下代码
upstream wanglei_xxxxx {
server 127.0.0.1:xxxxx;
}
server {
listen 80 ;
server_name wanglei0622.cn www.wanglei0622.cn;
#注释掉下面的请求类型过滤
#if ($request_method !~* GET|HEAD|POST) {
# return 403;
#}
rewrite ^(.*)\;jsessionid=(.*)$ $1 break;
location ~ ^/(WEB-INF)/ {
deny all;
}
location ~ \.(gif|jpg|jpeg|png|ico|rar|css|js|zip|txt|flv|swf|doc|ppt|xls|pdf)$ {
root /data/xxxxx;
access_log off;
expires 24h;
}
location / {
proxy_pass http://wanglei_xxxxx;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}
然后一看页面删除操作的JS代码,如下
/**
* @description 删除文章
* @param {String} id 文章 id
* @param {String} fromId 文章来自草稿夹(draft)/文件夹(article)
* @param {String} title 文章标题
*/
del: function (id, fromId, title) {
var isDelete = confirm(Label.confirmRemoveLabel + Label.articleLabel + '"' + title + '"?');
if (isDelete) {
$("#loadMsg").text(Label.loadingLabel);
$("#tipMsg").text("");
$.ajax({
url: latkeConfig.servePath + "/console/article/" + id,
type: "DELETE",
cache: false,
success: function (result, textStatus) {
$("#tipMsg").text(result.msg);
if (!result.sc) {
$("#loadMsg").text("");
return;
}
admin[fromId + "List"].getList(1);
}
});
}
}<br /><br />请求类型居然是 type: "DELETE" ,我也是醉了,哪位前端大神写的,不走寻常路啊!真是够坑的,幸亏我找BUG经验丰富,二分法快速定位问题位置,排除法确定问题。太有成就感了!<br />接下来就等域名备案通过了!</pre>
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于