记Weblogic部署BUG(websocket)
将含有websocket的SSM项目部署在Weblogic上面,遇到websocket报错如下
java.lang.ClassCastException: org.springframework.session.web.http.SessionReposi
toryFilter$SessionRepositoryRequestWrapper$HttpSessionWrapper cannot be cast to
weblogic.servlet.security.internal.SessionSecurityData
at weblogic.servlet.security.internal.SecurityModule.getCurrentUser(Secu
rityModule.java:197)
at weblogic.websocket.tyrus.TyrusServletFilter.doFilter(TyrusServletFilt
er.java:167)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.ja
va:78)
at com.codahale.metrics.servlet.AbstractInstrumentedFilter.doFilter(Abst
ractInstrumentedFilter.java:104)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.ja
va:78)
Truncated. see log file for complete stacktrace
直观看,是类型转换错误,发生在weblogic的对象中.
可以搜到的类似问题中,都在尝试将/websocket排除在web.xml中的filter之外,而这边遇到的项目,这么做不现实,所以开始分析该bug
思路:
1.DEBUG获取到出错的 filterChain,发现weblogic自行追加了一个fitler,叫TyrusServletFilter,错误在这个Filter中发生.
2.从weblogic的安装目录中找到TyrusServletFilter的jar包,引入到IDEA,准备反编译看源码
3.根据上面的报错,错误发生在SecurityModule中的getCurrentUser中,打断点DEBUG确定到具体行:
上图是TyrusServletFilter的反编译代码,红线处可看到,进入出错代码的条件
具体出错行,非常明了的强制转换,转换了request.getSession的结果
4.在该处进行DEBUG(居然真的能DEBUG),发现正常的时候,getCurrentUser的request参数是一个ServletRequestImpl对象(来自weblogic),而出错时,request参数是一个SecurityContextHolderAwareRequestWrapper对象,故确定问题是包装问题(即包装器的getSession并没有代理好其内部request的getSession方法)
解决方案:
确定了出错的包装类后,要重写并覆盖该类,代码如下:
该包装类原本并没有覆盖getSession方法,这里添加覆盖,加入和TyrusServletFilter中相同的判断逻辑,
如果符合条件,则就地一层一层拆包装,拆到ServletRequestImpl为止.再调用ServletRequestImpl的getSession返回出结果.
如果不符合条件,不做改变.
这大概是解决该问题的另一套思路了.
我这里由于使用了SpringSecurity,故要做修改的是SecurityContextHolderAwareRequestWrapper
如果使用了别的filter,那么可以覆盖其他的requestWrapper
当然最简单的方案还是在web.xml中将/websocket排除在所有filter外,如果不可以的话,再按我这个思路做改动
记Weblogic部署BUG(websocket)的更多相关文章
- 项目打包 weblogic部署
工作流打包: 由于没有集成单点,配置文件要修改 将webnocas.xml内容复制覆盖 web.xml 到这里修改完毕 选择weblogic项目,右键maven install,生成.ear文 ...
- 使用Linux脚本更新Weblogic部署的应用程序
在利用Jenkins实现Weblogic应用自动部署的功能时,如何通过Shell 脚本自动更新Weblogic部署的应用程序呢? 可以使用weblogic.jar包中的weblogic.Deploye ...
- 关于weblogic部署Java项目的包冲突问题
我们可能会用各种应用服务部署我们的Java应用,比如Tomcat.WAS.weblogic等.Tomcat和WAS可能会比较少遇到一些奇怪的问题,但是用weblogic部署项目则经常遇到一些比如包冲突 ...
- weblogic部署异常: cvc-enumeration-valid: string value '3.0' is not a valid enumeration value for web-app-versionType in namespace http://java.sun.com/xml/ns/javaee:<null>
尝试使用weblogic部署一个Demo应用,在选择应用目录后,报出下面的异常: VALIDATION PROBLEMS WERE FOUND problem: cvc-enumeration-val ...
- 性能测试——记weblogic 连接池满无法链接故障诊断过程
记weblogic 连接池满无法链接故障诊断过程 前段时间公司负责建行的一个票据系统在,上线前几个分行试运行环境下,每天后台日志都会报oracle.jdbc.xa.OracleXAException, ...
- 记网站部署中一个奇葩BUG
网页中引用的文件名不要带 adv 等 近日在写好一个网页后就把他部署到apache上测试,结果用chrome访问时有个背景图片总显示不出来,但是用firefox等却一切正常, 关键是我用windows ...
- IDEA+weblogic部署运行项目
前段时间再服务器上为了部署一个系统,一直存在各种问题,不过过程中倒是把weblogic的部署掌握地特别熟练,下面就一些主要步骤做个记录:1.自己用的是IDEA,所以打开项目之后需要设置src/main ...
- 1.tomcat部署项目的几种方式和weblogic部署方式及一点通讯
第一种部署方式: 直接使用myeclipse 找到server服务 添加要部署的项目Add Deployment ,然后选中某个项目,首选Exploded Archive(development ...
- Weblogic部署web项目代码中获取项目名为null的问题
写在前面 这个问题之前遇到一次, 时间久就忘了, 还是好记性不如烂笔头, 记一下吧.Windows下部署到Tomcat和Linux下部署到Weblogic的获取项目名写法. 关键代码 java代码 w ...
随机推荐
- 保存标注对象到txt 制作xml
1.算法将检测的目标名称和目标位置保存到txt文本 图片名 xmin ymin xmax ymax (4).avi237face.jpg4smoke 83 234 142 251hand 119 2 ...
- JUC原子类--01
JUC原子操作类分为四种类型 1. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ;2. 数组类型: AtomicIntegerArray, Atomi ...
- http请求requestUtils
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...
- mybatis注解调用存储过程
mapper @SelectProvider(type = RoleMenuSqlProvider.class,method = "updateRoleMenuRelation") ...
- javascript高级程序设计第3版——第8章 BOM(浏览器对象模型)
第八章,浏览器对象模型 主要介绍了window的几个对象以及框架,窗口的关系,各个浏览器对象的属性以及方法:
- 李航《统计学习方法》CH01
CH01 统计学方法概论 前言 章节目录 统计学习 监督学习 基本概念 问题的形式化 统计学习三要素 模型 策略 算法 模型评估与模型选择 训练误差与测试误差 过拟合与模型选择 正则化与交叉验证 正则 ...
- Spring官方文档下载
Spring框架是目前最流行的java web开发框架,很多时候,我们需要去查看spring的官方文档,这里就简单介绍下如何下载其官方文档. 1.搜索到spring 官网并进入 2.点击DOCS 3. ...
- 【技巧】easyUI datagrid在隐藏时加载,显示时无法加载出界面
注意在显示时调用再调用一次resize就可以显示出来 $("#"+datagridId).datagrid("resize");
- DBUtils——handler
ArrayHandler: 把结果集中的第一行数据转成对象数组. ArrayListHandler: 把结果集中的每一行数据都转成一个对象数组,再存放到List中. BeanHandler: 将结果集 ...
- 活代码LINQ——09
一.代码 ' Fig. 9.7: LINQWithListCollection.vb ' LINQ to Objects using a List(Of String). Module LINQWit ...