tokenSession拦截器的使用
学习进度&重点 struts2

学习进度第一周12.19 初步了解struts212.20 编写类似hello world 的应用,解读struts.xml的一些基本参数12.21 学习使用拦截器12.22 学习类型转换12.23 继续类型转换第二周12.26 struts2的输入验证12.27 struts2的上传12.28 struts2的下载12.29 struts2的国际化(简略)以及标签(控制标签)12.30 struts2的标签(数据标签)12.31 struts2的标签的复习第三周1.4 struts2的标签(表单标签)1.5 非表单UI标签1.6 struts2 整合spring2.5第四周1.9 struts2 整合spring2.01.10 struts2 整合hibernate2.5学习重点1 struts 几个常用的返回类型:请求转发(dispatcher)、重定向(rediect)、Action链:chain(它是一个拦截器)将两个连续的Action串联,通过前一个A的get方法与后一个的set方法联系起来。
这几个Action是通过“值链”的形式存储临时数据的。
要想Action 链能正常工作,必须为第二个以及后面的Action都配chain拦截器。
rediectAction 重定向到一个Action;xslt Acion在执行完毕后属性信息进行转换。
需要注意的是:stream会返回数据流,一般用于文件下载请求转发(分发视图)直接转发到jsp页面上,不会造成数据的损失,但重定向需要两次请求才能完成工作,因此会失去第一次传输时候的数据<package name="template" extends="rdcs-package" namespace="/template"><action name="*_*" class="com.nssc.rdcs.template.action.{1}Action" method="{2}"> <result name="redirect_fullpath" type="redirect">${target}</result><result name="redirect" type="redirect">/template/${target}.do</result><result name="template_main" type="redirect">/template/index.jsp</result><result name="custom">/template/${target}.jsp</result><result name="input">/template/${target}.jsp</result><!-- 转向页签模板的 --><resultname="template_custom">/tabTemplate/${tempForder}/${target}.jsp</result><resultname="template_input">/tabTemplate/${tempForder}/${target}.jsp</result><!-- 模板下载相关配置 --><paramname="directory">D:/apache-tomcat-6.0.24/webapps/RDCS/tabTemplate</param><result name="success" type="stream"><param name="contentType">text/plain</param><param name="inputName">inputStream</param><param name="contentDisposition">attachment;filename="${filename}"</param><param name="bufferSize">2048</param></result></action></package>2 OGNL 表达式(# % $):可以在配置结果的时候使用动态页面和动态URL ,使开发更快速。
requestinterceptor使用

requestinterceptor使用请求拦截器是一个用于处理请求的中间件,它允许我们在发送请求之前或之后对请求进行修改。
请求拦截器是用于修改或添加请求头、转换请求数据等操作的工具,它能够帮助我们更加灵活地管理、定制请求的过程,并为我们的应用提供更丰富的功能。
请求拦截器的应用场景非常广泛,比如在项目中,我们常常需要向服务器发送需要验证的请求,在这种情况下,我们就可以使用请求拦截器来对请求进行鉴权,以确保请求是合法的。
除此之外,请求拦截器还可以用于资源加密和解密,缓存机制的实现,请求过滤等等。
在实际项目中,使用请求拦截器有很多好处:1. 统一设置请求头。
有些 API 需要在请求头中添加权限验证参数(比如 token),我们可以利用拦截器在发送请求时统一设置请求头部,而不用在每个 API 中手动设置,这提高了代码的复用性和开发效率。
2. 请求参数转换。
有些后端 API 会要求我们按照特定格式将请求参数传递给服务器,而我们在前端可能不想使用该格式。
此时,我们便可以通过请求拦截器中的 transformRequest 函数来转换请求参数。
3. 请求过滤。
通过请求拦截器,我们可以动态过滤请求,比如我们可以根据不同场景对请求的参数、请求路径等进行动态的修改,这为我们的项目带来了更加灵活和多样化的功能。
4. 实现缓存机制。
使用请求拦截器,在发起请求前,我们可以先从本地缓存中获取数据,如果本地有,则不必再次发送请求,直接从缓存中获取即可,大大节省了带宽。
5. 将请求标记为重试。
在网络环境不稳定时,可能会出现网络请求失败的情况。
此时,我们可以通过请求拦截器设置 retry 标记,使请求在失败后自动重试。
以上是请求拦截器的一些应用场景。
我们可以根据需求,在具体项目中进行灵活配置和使用。
在实现请求拦截器时,一般需要考虑以下几个步骤:1. 创建 axios 实例,并使用 create 方法创建请求拦截器实例。
2. 在请求拦截器实例中,通过 use 方法添加请求拦截器,并对请求进行修改或修改请求头等操作。
Struts2拦截器及其用法说明

prepare
如果action实现Preparable接口,将会调用该拦截器的prepare()方法
Profiling Interceptor
【概要拦截器】
profiling
允许action记录简单的概要信息日志
Scope Interceptor
【作用域拦截器】
scope
这是范围转换拦截器,它可以将Action状态信息保存到HttpSession范围,或者保存到ServletContext范围内。
token
org.apache.struts2.interceptor.TokenInterceptor
tokenSesห้องสมุดไป่ตู้ion
org.apache.struts2.interceptor.TokenSessionStoreInterceptor
validation
org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor
Token Interceptor
【令牌拦截器】
token
检查action的合法令牌,以防止重复提交表单,当表单被多次提交时,跳转到一个错误页面
Token Session Interceptor
【令牌会话拦截器】
tokenSession
功能与令牌拦截器相同,但是对于非法令牌,提交的数据将保存在会话中,不跳转到错误页面,再次生成与第一次相同的页面。
【消息存储拦截器】
store
在会话中为action存储和检索消息、字段错误以及action错误,该拦截器要求action实现ValidationAware接口
session的工作原理用法

session的工作原理用法
Session的工作原理是在服务器端为每个用户创建一个唯一的会话,并为该会话存储数据。
Session的用法主要包括以下几个步骤:
1. 客户端发送请求到服务器,并在请求头中携带Session ID (一般通过Cookie传递)。
2. 服务器端检查请求头中的Session ID,并根据该ID来查找对应的会话。
3. 如果找到了对应的会话,服务器会从会话存储器(如内存、数据库等)中获取存储的数据。
4. 服务器对请求进行处理,并可以根据需要修改会话数据。
这些修改后的数据将保存在会话存储器中。
5. 服务器将会话数据发送给客户端,并将会话ID通过Cookie 设置在响应头中,以便客户端在后续请求中携带。
6. 客户端收到响应后,将会话ID保存在Cookie中。
7. 客户端后续的请求中会自动携带该Cookie,服务器就可以根据请求头中的Session ID找到对应的会话,继续存取会话数据。
通过这种方式,Session能够在多个请求之间维持用户的会话
状态,并且保证数据的安全性。
可以在会话中存储用户的登录状态、购物车信息等重要数据,提升用户体验。
拦截器注解的简单使用

拦截器注解的简单使用在Java开发中,拦截器注解通常用于实现对方法进行权限控制、参数校验、日志记录等功能。
下面以权限控制为例,介绍一下拦截器注解的简单使用。
首先,我们需要定义一个拦截器类,实现MethodInterceptor接口,该接口需要实现intercept方法,该方法代表着方法执行前后的处理逻辑。
具体代码如下:```javapublic class AuthInterceptor implements MethodInterceptorpublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable//在方法执行前进行权限校验if (!checkPermission()throw new UnauthorizedException("Unauthorized");}//执行目标方法Object result = proxy.invokeSuper(obj, args);//在方法执行后进行日志记录log(method, args, result);return result;}private boolean checkPermissio//模拟权限校验逻辑return true; // 返回true代表通过校验}private void log(Method method, Object[] args, Object result) //模拟日志记录逻辑System.out.println("Method: " + method.getName( + " Args: " + Arrays.toString(args) + " Result: " + result);}```上述代码中,intercept方法用于在目标方法执行前后进行权限校验和日志记录。
彻底搞懂Token、Session和Cookie

彻底搞懂Token、Session和CookieHTTP 是⽆状态的,全部的请求都是⽆状态的。
然⽽,某些情况下我们想让我们的状态能被记住。
⽐如,浏览⼀家在线商店,当我们把⾹蕉放到购物车中后,再去其他页⾯购买苹果时,并不希望我们的⾹蕉消失。
在在线商店的各个页⾯中穿梭时,我们是希望想我们的购买状态是能够被记住的!为了克服 HTTP 请求⽆状态的性质,我们可以使⽤ session 或者 token。
简单来说有两种⽅式可以记住⽤户的状态session和token都是⽤来保持会话,功能相同。
基于 Session基于 session 的认证中,⽤户登录后服务器会为登录⽤户创建⼀个 session,Cookie的验证是有状态的,sessionid 会保存在⽤户浏览器的 cookie 中。
当⽤户登录成功后,cookie 会随着后边的每个请求⼀起发送。
这样,服务器通过 cookie 中的 sessionid 找到内存中的 session 数据,来验证⽤户⾝份,从⽽在响应中返回相应的状态。
1.客户端发送⼀个http请求带着⽤户名密码到服务器端2.服务器端接受了客户端请求后,建⽴⼀个session,并发送⼀个http响应到客户端,这个响应头包括了set-cookie的头部,头部⾥⾯包括了sessionidset-cookie的格式如下 Set-Cookie:value [ ;expire=date ][ ;damain=domain ][ ;path=path ][ ;secure ]3.客户端发起第⼆次请求,服务器已经给了setcookie,浏览器⾃动在请求头上获取到cookie并分解验证信息成功后返回respense给客户端session的弊端:session是服务端存储的⼀个对象,主要⽤来存储所有访问过该服务端的客户端的⽤户信息(也可以存储其他信息),从⽽实现保持⽤户会话状态。
但是服务器重启时,内存会被销毁,存储的⽤户信息也就消失了。
struts token 机制学习理解
struts2中使用token避免重复提交1.在struts.xml中<action name="register" class="org.sunxin.struts2.action.RegisterAction"><!-- 配置异常映射,当RegisterAction抛出Exception异常时,向用户显示error.jsp页面--><exception-mapping result="error" exception="ng.Exception"/><result name="input">/pages/register.jsp</result><result name="success">/pages/success.jsp</result><result name="error">/pages/error.jsp</result><result name="invalid.token">/pages/register.jsp</result><result name="wait">wait.jsp</result><interceptor-ref name="defaultStack"></interceptor-ref><interceptor-ref name="token"><param name="excludeMethods">input</param></interceptor-ref></action>2.在页面中加<s:actionerror/><s:form action="register" method="post"><s:token></s:token></s:form>3.<interceptor-ref name="token"/><interceptor-ref name="token-session"/><!--注意struts2.0 拦截器名字为token-session struts2.1.2 已经更改为tokenSession -->token: 在活动中检查合法令牌(token), 防止表单的重复提交; 在<s:actionerror/>会产生提示信息token-session: 同上, 但是在接到非法令牌时将提交的数据保存在session中; 不会在<s:actionerror/>会产生提示信息只会在后台发出警告并处理,如下:警告: Form token KO80SIJW4F84034NG5HM1ZBUGOVNY64D does not match the session token null.编辑特别推荐:为struts1.2增加token标签令牌标签[修改更新 2009-07-28 修复了一个BUG]2009-07-23 17:282009-07-28更新提醒:修改了一个页面不能存在多个表单的BUGpackage com.tgmsp.CongZhong.tag;import java.io.IOException;import javax.servlet.http.HttpServletRequest;import javax.servlet.jsp.JspException;import javax.servlet.jsp.JspWriter;import javax.servlet.jsp.tagext.TagSupport;import org.apache.struts.Globals;import org.apache.struts.taglib.html.Constants;import org.apache.struts.util.TokenProcessor;public class TokenTag extends TagSupport {public int doEndTag() throws JspException {HttpServletRequest request =(HttpServletRequest)pageContext.getRequest();JspWriter out = pageContext.getOut();try {Object tmp = null;String token = (tmp =request.getSession().getAttribute(Globals.TRANSACTION_TOKEN_KEY))==nu ll?TokenProcessor.getInstance().generateToken(request):tmp.toString() ;if (token != null) {request.getSession().setAttribute(Globals.TRANSACTION _TOKEN_KEY, token);out.println("<input type=\"hidden\"name=\""+Constants.TOKEN_KEY+"\" value=\""+token+"\"/>");}} catch (IOException e) {e.printStackTrace();}return this.EVAL_PAGE;}}....标签配置部分<tag><name>token</name><tagclass>com.tgmsp.CongZhong.tag.TokenTag</tagclass><bodycontent>empty</bodycontent><info><![CDATA[保存Struts令牌org.apache.struts.action.TOKEN<congzhong:token/>]]></info></tag>....实例一:防止表单重复提交防止重复提交:有两种方法:一是使用token拦截器,二是使用tokenSession第一种方法步骤:1、先在页面中放一个令牌。
struts2的token实现
Struts2中使用token避免重复提交的方法作者: 佚名, 出处:IT专家网,责任编辑: 谢妍妍,2009-09-22 13:00本文Struts2中使用token避免重复提交的方法1.在struts.xml中<action name="register" class="org.sunxin.struts2.action.RegisterAction"> <!-- 配置异常映射,当RegisterAction抛出Exception异常时,向用户显示error.jsp页面--><exception-mapping result="error" exception="ng.Exception"/><result name="input">/pages/register.jsp</result><result name="success">/pages/success.jsp</result><result name="error">/pages/error.jsp</result><result name="invalid.token">/pages/register.jsp</result><result name="wait">wait.jsp</result><interceptor-ref name="defaultStack"></interceptor-ref><interceptor-ref name="token"><param name="excludeMethods">input</param></interceptor-ref></action>2.在页面中加<s:actionerror/><s:form action="register" method="post"><s:token></s:token></s:form>3..<interceptor-ref name="token"/><interceptor-ref name="token-session"/><!--注意struts2.0 拦截器名字为token-session struts2.1.2 已经更改为tokenSession -->token: 在活动中检查合法令牌(token), 防止表单的重复提交; 在会产生提示信息token-session: 同上, 但是在接到非法令牌时将提交的数据保存在session中; 不会在会产生提示信息只会在后台发出警告并处理,如下:警告: Form token KO80SIJW4F84034NG5HM1ZBUGOVNY64D does not match the session token null.编辑推荐:1. Struts2拦截器execAndWait简介2. Struts2教程:第一个Struts2程序3. Struts2对WebWork的改进struts2使用拦截器来检查表单是否重复提交,它采用同步令牌的方式来实现对表单重复提交的判断。
session+认证与token认证的差异
Session认证和Token认证是两种常见的身份验证机制,它们在实现方式和工作原理上有一些差异。
Session认证:●Session认证是基于服务器端的认证机制。
●当用户进行身份验证成功后,服务器会为用户创建一个唯一的会话(session)标识,并将该标识存储在服务器端的内存或数据库中。
●服务器将该会话标识发送到客户端的Cookie中,以便在后续的请求中进行验证。
●客户端在每次请求中都会将会话标识作为Cookie发送给服务器,服务器通过比对会话标识来验证用户的身份和权限。
●服务器可以在会话中存储用户的相关信息,以便在用户会话期间进行状态管理。
Token认证:●Token认证是一种基于令牌(token)的认证机制。
●当用户进行身份验证成功后,服务器会生成一个加密的令牌,并将其返回给客户端。
●客户端在后续的请求中,将该令牌作为请求头或请求参数的一部分发送给服务器。
●服务器通过验证令牌的合法性、完整性和有效期来验证用户的身份和权限。
●服务器不需要在服务器端存储令牌或会话状态,因为令牌本身包含了所有必要的信息。
主要差异:●存储位置:Session认证需要在服务器端存储会话信息,而Token认证在服务器端不需要存储状态信息,令牌本身就包含了所需的信息。
●扩展性:Token认证相对于Session认证更容易扩展,因为服务器不需要存储会话状态,可以更轻松地进行负载均衡和分布式部署。
●跨域支持:Token认证对于跨域请求更加方便,因为令牌可以在请求头或请求参数中发送,而Session认证通常需要使用Cookie,对于跨域请求需要特殊处理。
选择Session认证还是Token认证取决于具体的应用需求和场景。
Session认证更适合传统的服务器端应用,而Token认证更适合分布式、跨域和API驱动的应用。
彻底理解cookie,session,token的使用及原理
彻底理解cookie,session,token的使⽤及原理发展史1、很久很久以前,Web 基本上就是⽂档的浏览⽽已,既然是浏览,作为服务器,不需要记录谁在某⼀段时间⾥都浏览了什么⽂档,每次请求都是⼀个新的HTTP协议,就是请求加响应,尤其是我不⽤记住是谁刚刚发了HTTP请求,每个请求对我来说都是全新的。
这段时间很嗨⽪2、但是随着交互式Web应⽤的兴起,像在线购物⽹站,需要登录的⽹站等等,马上就⾯临⼀个问题,那就是要管理会话,必须记住哪些⼈登录系统,哪些⼈往⾃⼰的购物车中放商品,也就是说我必须把每个⼈区分开,这就是⼀个不⼩的挑战,因为HTTP请求是⽆状态的,所以想出的办法就是给⼤家发⼀个会话标识(session id), 说⽩了就是⼀个随机的字串,每个⼈收到的都不⼀样,每次⼤家向我发起HTTP请求的时候,把这个字符串给⼀并捎过来,这样我就能区分开谁是谁了3、这样⼤家很嗨⽪了,可是服务器就不嗨⽪了,每个⼈只需要保存⾃⼰的session id,⽽服务器要保存所有⼈的session id !如果访问服务器多了,就得由成千上万,甚⾄⼏⼗万个。
这对服务器说是⼀个巨⼤的开销,严重的限制了服务器扩展能⼒,⽐如说我⽤两个机器组成了⼀个集群,⼩F通过机器A登录了系统,那session id会保存在机器A上,假设⼩F的下⼀次请求被转发到机器B怎么办?机器B可没有⼩F的 session id 啊。
有时候会采⽤⼀点⼩伎俩: session sticky ,就是让⼩F的请求⼀直粘连在机器A上,但是这也不管⽤,要是机器A挂掉了,还得转到机器B去。
那只好做session 的复制了,把session id 在两个机器之间搬来搬去,快累死了。
后来有个叫Memcached的⽀了招:把session id 集中存储到⼀个地⽅,所有的机器都来访问这个地⽅的数据,这样⼀来,就不⽤复制了,但是增加了单点失败的可能性,要是那个负责session 的机器挂了,所有⼈都得重新登录⼀遍,估计得被⼈骂死。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
文章内容来自Java私塾2013-12-27
更强大的tokenSession拦截器
回顾一下上面<s:token/>标签和token拦截器连用,解决了重复提交问题,用法极其简单:Action 引用token拦截器,<s:form/>标签内加一个<s:token/>标签,两句话就足以概括,一分钟就足以做完。
但是结果稍稍有点遗憾:对于一次正常提交和一次重复提交,使用token拦截器会使得浏览器最终重定向到invalid.token指定的Result。
那么,有没有更好的办法可以让“重复提交”看起来好像没有发生过,浏览器最终跳转到正常提交指定的Result呢?
当然有,而且做法同样简单,把token拦截器换为tokenSession拦截器即可。
tokenSession 拦截器与token拦截器唯一的不同是在判断某个请求为重复请求之后,并不是立即重定向到名为invalid.token的Result,而是先阻塞这个重复请求,直到浏览器响应最初的正常请求,然后就可以跳转到处理正常请求后的Result了。
因此,只需要修改struts.xml即可,示例如下:
java代码:
查看复制到剪贴板打印
1.<package name="helloworld"extends="struts-default">
2. <action name="tokenAction"class="cn.javass.token.TokenAction">
3. <interceptor-ref name="tokenSession"/>
4. <interceptor-ref name="defaultStack"/>
5. <result>/token/list.jsp</result>
6. </action>
7.</package>
只做了两点修改:
∙由引用token拦截器变为引用tokenSession拦截器。
∙不再需要名为invalid.token的Result。
再次运行看看,虽然重复提交了,但是仍然正常跳转到success指定的页面了,而且后台也只是处理了一次。
私塾在线网站原创《研磨Struts2》系列
更多内容在‘java私塾官网’。