struts2 存取cookie

Struts2漏洞全解析:从OGNL注入到RCE实战与防御 在Java Web应用开发中,框架安全是保障系统稳定性的核心议题。OGNL(Object-Graph Navigation Language)作为一种表达式语言,其设计初衷是简化对象图的导航与操作,但在特定框架实现中,若对用户输入处理不当,可能导致表达式注入漏洞。其原理在于攻击者通过构造恶意参数,使框架在解析过程中将输入误认为OGNL表达式执行,从而绕过安全沙箱,实现权限提升。这类漏洞的技术价值在于揭示了“框架级”安全问题的共性模式,即参数解析链与执行上下文的耦合风险。在应用场景上,Struts2作为历史悠 阅读详情

1.首先Action要实现CookiesAware接口,包括:添加类型为Map<String, String>的field(在所示代码中名为cookie),并实现setCookiesMap方法。 

复制代码
  
1 public class BasicAction extends ActionSupport implements CookiesAware{ 2 3 ... 4 5   private Map < String, String > cookie; 6 7 @Override public void setCookiesMap(Map < String, String > cookies) { this .cookie = cookies; }
8 9 ... 10 11 }
复制代码

2.在struts.xml中定义cookie拦截器,主要是设置哪些cookie需要被拦截器管理(也就是由拦截器从cookie文件里读出来)。

示例配置:struts会自动读取cityname,username这两个cookie,把它们的值通过setCookiesMap方法装载到相应的cookie map中。

复制代码
1         <interceptors>
2             <interceptor-stack name="myStack">
3                 <interceptor-ref name="cookie">
4                     <param name="cookiesName">xxx,xxx,xxx</param>
5                     <param name="cookiesValue">*</param>
6                 </interceptor-ref>
7                 <interceptor-ref name="defaultStack" />
8             </interceptor-stack>
9         </interceptors>
复制代码

注:

cookiesName是要由拦截器管理的cookie name list,以“,”隔开;同理 cookiesValue是cookie value list;二者都可以设置为*,表示任意值;

defaultStack是struts默认的拦截器栈,需显式添加,否则会报错,有兴趣可以看看它的定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<!-- A complete stack with all the common interceptors in place.
      Generally,  this  stack should be the one you use, though it
      may  do  more than you need. Also, the ordering can be
      switched around (ex:  if  you wish to have your servlet-related
      objects applied before prepare() is called, you'd need to move
      servlet-config interceptor up.
 
      This stack also excludes from the normal validation and workflow
      the method names input, back, and cancel. These typically are
      associated with requests that should not be validated.
      -->
<interceptor-stack name= "defaultStack" >
     <interceptor-ref name= "exception" />
     <interceptor-ref name= "alias" />
     <interceptor-ref name= "servletConfig" />
     <interceptor-ref name= "prepare" />
     <interceptor-ref name= "i18n" />
     <interceptor-ref name= "chain" />
     <interceptor-ref name= "debugging" />
     <interceptor-ref name= "profiling" />
     <interceptor-ref name= "scopedModelDriven" />
     <interceptor-ref name= "modelDriven" />
     <interceptor-ref name= "fileUpload" />
     <interceptor-ref name= "checkbox" />
     <interceptor-ref name= "staticParams" />
     <interceptor-ref name= "params" >
       <param name= "excludeParams" >dojo\..*</param>
     </interceptor-ref>
     <interceptor-ref name= "conversionError" />
     <interceptor-ref name= "validation" >
         <param name= "excludeMethods" >input,back,cancel,browse</param>
     </interceptor-ref>
     <interceptor-ref name= "workflow" >
         <param name= "excludeMethods" >input,back,cancel,browse</param>
     </interceptor-ref>
</interceptor-stack>

另外,由于拦截器是按定义的先后顺序执行,而我在validate()中需要从cookiemap中获得部分用户信息,因此这里 cookie拦截器需在default之前。

3.把上一步定义好的cookie拦截器,指定给要存取cookie的action

两种方式,一是全局配置

1 <default-interceptor-ref name="myStack" />

二是对单个action配置

1 <action...>
2   <interceptor-ref name="myStack">
3   </interceptor-ref>
4  </action>

单独配置会覆盖全局配置,这也是要显式添加defaultStack的原因。

interceptor-ref还可以设置excludeMethods/includeMethods,具体参考http://struts.apache.org/2.0.11/docs/interceptors.html

本以为配置完CookieAware,用cookieMap.add(name,value)就能自动保存cookie了,没想到cookie文件根本没变化,原来 CookieInterceptor只做了读cookie这一步,写就不管了。

CookieInterceptor:The aim of this intercepter is to set values in the stack/action based on cookie name/value of interest.

有兴趣可以看看 CookieInterceptor是怎么实现的。

4.在action中添加cookie的增删方法,通过ServletActionContext.getResponse().addCookie实现

复制代码
 1     public void addCookie(String name,String value){
 2         //创建Cookie
 3          Cookie cookie = new Cookie(name, URLEncoder.encode(value));
 4         //设置Cookie的生命周期
 5          cookie.setMaxAge(60*60*24*365);
 6         ServletActionContext.getResponse().addCookie(cookie);
 7     }
 8     
 9     public void removeCookie(String name){
10         addCookie(name,"TEST");//“TEST”可以是任意非空字段
11     }
12     
13     public String getCookie(String name){
14         String value=cookie.get(name);
15         if(value!=null)
16             return URLDecoder.decode(value);
17         return null;
18     }
复制代码

注:因为在我的应用环境中cookie value是汉字,需要先encode,否则保存时抛异常:

java.lang.IllegalArgumentException: Control character in cookie value, consider BASE64 encoding your value

我没找到删除cookie的方法,所以用addCookie(name,"TEST")间接代替删除方法,这样可以在取出cookie时根据值是否等于TEST来判断cookie是否是删除状态;如果有更好的办法再改进吧

Struts2+cookie实现的购物车 立即下载

相关推荐

struts2与cookie实现自动登录

使用struts2和cookie实现自动登录

struts2使用cookie详解

Struts2中,截取HTTP请求中的Cookie信息是由cookie拦截器(CookieInterceptor)来完成的 — action类可以通过使用cookie拦截器来读取cookie的值。 cookie拦截器的声明 由于默认情况下不使用cookie拦截器(不在defaultStack中),因此在struts.xml配置文件中需要对其进行声明:

心有猛虎,细嗅蔷薇 4611

OBD诊断协议:OBDⅡ (SAE J1979) 和 OBDonUDS (SAE J1979-2) 和ZEV OBD技术架构的详细对比

摘要:文章对比了2025年最新OBD技术标准(SAEJ1979系列)的三大架构:传统OBD-II(已淘汰)、OBDonUDS(燃油/混动车)和ZEVOBD(新能源车)。核心发现:1)OBDonUDS与ZEVOBD共享UDS协议栈和DoIP通信标准,仅应用层数据(DID/DTC)不同;2)物理层统一为CAN+以太网,支持远程诊断和OTA;3)诊断工具需同时兼容J1979-2/3数据库。技术演进呈现"协议统一化、数据专用化"趋势,2027年后所有新车将强制采用新标准。

m0_56482679的博客 2396

struts2 Action中cookie的添加、获取、删除

添加cookie cookie phone; phone = new Cookie("userHp", hp);  phone.setMaxAge(60 * 60 * 24 * 365);  phone.setPath("/");  ServletActionContext.getResponse().addCookie(phone);   获取cookie public String ...

钢铁鸭 936

Docker容器n8n中 read/write files from disk 无法读取容器内文件解决方案

《n8n文件读写Docker部署常见问题解决方案》摘要:针对n8n 1.90.2版本在Docker环境下文件读写失败问题,本文分析常见错误包括路径错误(ENOENT)、权限不足(EACCES)及节点误用问题。核心解决方案为:1)通过-v参数挂载宿主机目录到容器(如/files);2)使用新版Read/WriteFilesfromDisk节点操作文件;3)确保权限设置正确。提供可直接导入的示例工作流JSON,演示从CSV读取到结构化数据处理的全流程。特别强调已部署用户需重新挂载卷的正确操作方式,并附解决方案对

m0_74822402的博客 2184

告别Keil手动分区!用CubeMX+VS Code一键生成带Bootloader的STM32 OTA工程

本文详细介绍了如何利用STM32CubeMX和VS Code实现STM32 OTA工程的自动化构建,告别传统Keil手动分区的繁琐流程。通过图形化配置Flash分区、自动生成链接脚本以及实现Bootloader跳转逻辑,开发者可以高效完成远程升级功能开发,显著提升嵌入式开发效率。

weixin_33720956的博客 390

struts2 cookie的使用

这两天在做cms与后台的连接部分,也不是很懂,网友湖水没了(www.publiccms.com的作者),告诉我可以通过cookie的方式,做到2个工程之间传递参数,于是在网上搜索了资料,cookie的使用,也就是基本的使用方式,javax.servlet.http.Cookie的使用,cookie的使用主要就几个set方法cookie.setDomain("127.0.0.1"); cookie

fivestar2009的博客 2261

泛微OAe9实战:如何从零搭建一个车辆预约系统(附完整代码)

本文详细介绍了如何利用泛微OA e9的建模引擎,从零开始构建一个企业级车辆预约管理系统。文章深入解析了核心数据模型设计、前后端双重预约冲突校验机制,并重点演示了如何配置自定义资源看板以实现车辆使用状态的可视化监控。该系统设计思路通用,可扩展至会议室、设备等各类共享资源的管理。

weixin_28363123的博客 143

Struts2.0中的Cookie(实现自动登录)

首先,我的自动登录是这样子的。 在登录页面,有个复选框,问是否记住用户名和密码。如果不记住,下次就不会自动把用户名和密码显示出来。 首先把CookieUtil.java页面贴出来吧。此处的UserB很简单,UserB类里放的就是username与password两个属性页已。再者就是他俩的get、set方法了。 package com.struts.util; import java.

zhangqinhappy的专栏 6469

保姆级教程:用SOEM主站搞定汇川SV660N伺服驱动器的EtherCAT通讯(附完整C代码)

本文提供了一份详细的SOEM主站与汇川SV660N伺服驱动器EtherCAT通讯的实战教程,涵盖环境搭建、状态机理解、PDO映射配置、CiA402状态机实战、实时性能优化及诊断调试等关键步骤,并附完整C代码示例,帮助开发者快速实现工业级EtherCAT控制。

weixin_28292761的博客 306

计算机组成原理课程设计_微程序控制的简单模型机设计

微程序控制的简单模型机设计 要求 基本要求 完成一个简单主机的设计,模型机应具备如下能力:在自行设计的指令集基础上,运行自行编写的简单用户程序,实现特定运算功能。 弹性要求 在此基础上,完成必要的扩展,实现模型机的功能扩展设计,包括:实现多种运算功能(指令集的扩充)、支持更为丰富的寻址方式、有更为完善的微程序设计等。 实验软件和硬件环境 QuartusII, FPGA计算机组...

sailist的记录站 3万+

struts2 CookieInterceptor

*                 *                                       /index.jsp               public class CookieAction extends ActionSupport implements CookiesAware {     @Override     public voi

王星乐的博客 791

【Bug已解决】Codex 报错 MCP client for context7 failed to start: program not found 解决方案

方案适用场景推荐指数改用绝对路径Windows 上最常见、最有效的解决方式⭐⭐⭐⭐⭐提前全局安装避免依赖 npx减少运行时网络下载的不确定性⭐⭐⭐⭐使用 .cmd 后缀Windows 平台快速尝试⭐⭐⭐⭐开启调试日志需要更精确定位失败原因⭐⭐⭐⭐统一封装启动脚本需要跨平台兼容多个 MCP 服务⭐⭐⭐报错的本质是Codex 启动 MCP 子进程时,无法正确定位配置文件中写的简写命令名对应的可执行文件,尤其容易发生在 Windows 平台上使用npx这类简写命令的场景。

一键难忘的博客 5815

Struts2 对 cookie的存取

今天在网上搜索了以下struts2对cookie的操作,结果意外的是,竟然没有可以运行的例子,自己结合多方面资料写了两个函数 /***Cookieの追加*@return*@throwsException*/privatevoidaddCookie(Stringname,Stringvalue){...

185

详解Xilinx FPGA高速串行收发器GTX/GTP(1)--SerDes和GTX的关系

详解Xilinx FPGA高速串行收发器GTX/GTP(1)--SerDes和GTX的关系

孤独的单刀 4353

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

在Struts2 中存取Cookie.

本以为配置完CookieAware,用cookieMap.add(name,value)就能自动保存cookie了,没想到cookie文件根本没变化,原来 CookieInterceptor只做了读cookie这一步,写就不管了。CookieInterceptor:The aim

hepeng_8的专栏 1636

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Struts2 cookie的存取

/** * Cookieの追加 * @return * @throws Exception */ private void addCookie(String name,String value){ Cookie cookie = new Cookie(name, value); cookie.setM...

weixin_34026276的博客 101

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java Cookie取不到值和存取内容不一致 解决方案

在使用servlet的时候经常会碰到存入Cooike之后取不出来的问题后来在用struts2的时候被这个问题困扰了很久。最近找到了解决的方法先写一个正常情况下的存取Cookie事例public class CookieAction implements Action { public String execute() throws Exception { //创建Cookie

kingsunfan的博客 5950

struts2还有人用吗_java的这些面试题你会了吗?

一、基础1、JAVA中能创建volatile数组吗?volatile能使得一个非原子操作变成原子操作吗?2、10个线程和2个线程的同步代码,哪个更容易写?3、什么是线程局部变量?4、我们自己写一个容器类,然后使用for-each循环吗?5、说出5条IO的最佳实践?6、说出至少5点在Java中使用线程的最佳实践?7、我能在不进行强制转换的情况下将一个double值赋值给long类型的变量吗?8、我们...

weixin_39603778的博客 471

OGNL, JSTL, STRUTS2标签用法示例 总结

OGNL, JSTL, STRUTS2标签用法示例 (转载) 转载自http://www.blogjava.net/wjywilliam/articles/349036.html 取Session中的值            ${session.user.userId}   ${sessionScope.user.userId}     基本语法 一、EL

小桥 流水 人家 839

OGNL,_JSTL,_STRUTS2标签中符号#,$,%的用法示例

OGNL, JSTL, STRUTS2标签中符号#,$,%的用法示例  取Session中的值          ${session.user.userId}   ${sessionScope.user.userId}      基本语法 一、EL简介 1.语法结构     ${expression} 2.[]与.运算符     EL 提供

lanchengxiaoxiao的专栏 757
上一篇: 【转载】C3P0的详细配置说明
下一篇: 简述 Cookie和Session的区别和优缺点
SnakeMoving
博客等级 码龄11年 65粉丝 97原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值