老蔡的个人专栏正式成立,以后工作中遇到的技术问题,或者生活中对一些事物的见解,都会和大家分享!独乐乐不如众乐乐!

Struts 禁止用户直接访问JSP页面

SSHI BlandonTsai 1580℃ 0评论

struts logo

最近在项目收尾的时候,关于会员、管理员之类的权限校验都已经完工了。为了项目的安全性,禁止用户直接访问所有的 jsp 页面,在网上看了一部分的案例,发现五花八门。

把 JSP 页面放在 WEB-INF 目录下

这个是所有处理方案中出现频率最高的,为了不被访问就要把所有的页面放在 WEB-INF 目录下?这也太被动了,像我手里现在处理的项目一样,所有的 struts action 配置已经完工了。难道因为安全性转移了目录,我要把所有的 dispatcher 页面路径全部改一遍?No Way!!!对于如此不人性的方案,坚决不予采用。哥要实现的功能是:无论哥把页面放到哪一个目录,天南海北,用户都不能访问!这才是 word 哥。

定义个性化的过滤器

于是我想起来了,项目中为了处理 ckeditor 、ckfinder 相关的 servlet 请求时,专门定义了一个个性化过滤器对这些请求直接转发,不进行 action 处理。那既然过滤器能处理所有请求,对于 jsp 的页面当然也不在话下。话不多说,下面贴源码(满满的福利哟):

定义一个过滤器名为 PersonalFilter,并继承 Struts 的默认过滤器 StrutsPrepareAndExecuteFilter,然后重写 doFilter方法,添加自己的业务逻辑。

其中第一个 if 条件是处理 ckeditor、ckfinder、ueditor之类的富文本管理器时,所做的放行操作,因为这些个请求并不是 action 请求。

第二个 if 条件就是拦截 jsp 页面请求的,只要请求路径中包含了“.jsp”,就予以重定向的项目首页,安全性妥妥的。在看其他案例的时候,我发现有些网友用的是 getRequestURI().endWidth(“.jsp”) 来判断,意思是如果请求路径是以 .jsp 结尾的就进行拦截。不过这种处理方法是有潜在风险的,如果用户请求里面 .jsp?ad=81&mt=66…. 像这种请求路径后面存在其他参数,并不是以 .jsp 结尾,这种写法是拦截不住的。

第三个就是默认的对 action 请求进行放行。

定义好后,如果要生效,必须在 web.xml 中声明这个过滤器,struts 的过滤器就不用配了,因为已经继承过了:

使用个人定义的过滤器,对于用户请求的处理会有更多的灵动性,方便进行扩展,建议大家多使用此种方案。

转载请注明:似水流年 » Struts 禁止用户直接访问JSP页面

如果觉得文章还不错,欢迎打赏
喜欢 (0)or分享 (0)
小花虎
发表我的评论
取消评论


(1)个小伙伴在吐槽
  1. 小花虎
    哎哟 word哥 话说还不错哦! :dance:
    小花虎2016-11-11 22:07 回复