I'm using Struts 2 in my business web application, and to prevent double entry at the time of refresh page I had add interceptor in my struts.xml file in action
<interceptor-ref name="tokenSession"/>
When I will insert this statement, it will always redirect to invalid.token and goes to tiles - requisition.tiles. What is the mistake I've done?
And if I will remove above interceptor then it will work fine, so what's the problem?
My code in struts2.xml
<action name="*Requisition" class="com.sttl.rpsc.action.RequisitionAction" method="{1}Requisition">
<interceptor-ref name="basicStack" />
<interceptor-ref name="validation">
<param name="excludeMethods">setupRequisition,setupPostRequisition,setupQualificationRequisition,setUpForUpdateQualificationRequisition,
setupAgeRequisition,setupReservationRequisition,deletePostRequisition,showSaveCancelRequisition,setUpForUpdateAgeRequisition,setUpForUpdateReservationRequisition,
deleteQualificationRequisition,deleteAgeRequisition,deleteReservationRequisition,setScrutinizePostRequisition</param>
</interceptor-ref>
<interceptor-ref name="tokenSession"/>
<result name="invalid.token" type="tiles">/requisition.tiles</result>
<result name="input" type="tiles">/requisition.tiles</result>
<result name="success" type="tiles">/requisition.tiles</result>
<result name="error" type="tiles">/requisition.tiles</result>
<result name="cancel" type="redirect">rpscadminsecure.action</result>
<result name="getRequisitionList" type="chain">setupRequisition</result>
<result name="reqsuccess" type="chain">setupPostRequisition</result>
<result name="postsuccess" type="tiles">/requisitionpost.tiles</result>
<result name="qualisuccess" type="tiles">/requisitionqualification.tiles</result>
<result name="agesuccess" type="tiles">/requisitionage.tiles</result>
<result name="ressuccess" type="tiles">/requisitionreservation.tiles</result>
<result name="saveOrCancelsuccess" type="tiles">/saveOrCancelrequisition.tiles</result>
<result name="cancelSuccess" type="redirect">setupRequisition</result>
<result name="successSetupScrutinize" type="tiles">/requisitionpost.tiles</result>
</action>
You have to change the order of the declaration in the interceptors. Something like this:
<action name="someAction" class="com.examples.SomeAction">
<interceptor-ref name="token-session/>
<interceptor-ref name="basicStack"/>
<result name="success">good_result.ftl</result>
</action>
The basicStack is the last in the order.
Related
I have a namespace in struts.xml
<package name="mobile" namespace="/mobile" extends="mainApp">
<action name="abc" class="x.y.Abc"
method="abc">
<result name="input">/blank.html</result>
<result name="success">/blank.html</result>
</action>
</package>
I want to map localhost/myApp/mobile/ with the action abc
I don't mind localhost/myApp/mobile/* getting mapped with the action abc
is there any way to meet this requirement?
I want to fire an action on localhost:8080/appname/namespace/ i.e. namespace slash
After slash should be action name and if it's empty you should configure empty action name.
<package name="mobile" namespace="/mobile" extends="mainApp">
<action name="" class="x.y.Abc"
method="abc">
<result name="input">/blank.html</result>
<result name="success">/blank.html</result>
</action>
</package>
try <default-action-ref/>:
<package name="mobile" namespace="/mobile" extends="mainApp">
<default-action-ref name="abc"/> <!-- I added this -->
<action name="abc" class="x.y.Abc"
method="abc">
<result name="input">/blank.html</result>
<result name="success">/blank.html</result>
</action>
</package>
<interceptor-stack name="DefaultTEST">
<interceptor-ref name="exception" />
<!-- some more interceptors go in here -->
<interceptor-ref name="debugging" />
</interceptor-stack>
<default-interceptor-ref name="DefaultTEST" />
<action name="welcome">
<result type="tiles">WELCOME_PAGE</result>
</action>
<action name="">
<result ...>...</result>
</action>
... <!-- more actions -->
So my question is how to override the default interceptor stack so that for welcome action some other interceptors (or interceptor stack) can be loaded while the default one is not.
You can override the interceptors config if you reference an interceptor or interceptors stack in the action config explicitly.
<action name="welcome">
<interceptor-ref name="defaultStack" />
<result type="tiles">WELCOME_PAGE</result>
</action>
Only defaultStack will be executed for welcome action. Other actions that don't override the interceptors config in this package will use DefaultTEST because it's configured as default.
I am getting like "WARNING: Could not find token name in params."
In Struts.xml
<interceptors>
<interceptor name="entityInterceptor" class="entity.jpa.EntityInterceptor"/>
<interceptor name="sessionInterceptor" class="env.actionitems.struts.SessionInterceptor"/>
<interceptor-stack name="entityStack">
<interceptor-ref name="entityInterceptor"/>
<interceptor-ref name="sessionInterceptor"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="defaultStack">
</interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="entityStack"></default-interceptor-ref>
<action name="*acegitran*jsp*pkg*create*dcode*" method="{1}" class="env.transactions.{3}.{4}">
<interceptor-ref name="token"/>
<interceptor-ref name="entityStack"/>
<result name="invalid.token">Transaction.{2}iport{5}create</result>
<result name="success" type="tiles">Transaction.{2}iport{5}create</result>
<result name="error" type="tiles">Transaction.{2}iport{5}create</result>
<result name="input" type="tiles">Transaction.{2}iport{5}create</result>
</action>
In JSP
<s:token name="clientToken"/>
Any other parameters should be passed in struts.xml to solve.
I had a similar problem. You might want to try changing "invalid.token" to "invalid.clientToken" in the Struts.xml file
eg
result name="invalid.clientToken"
Please remember that the Struts.xml file will only take effect after the server is restarted!
Hope that helps
im doing a modification on an existing app. my problem is even tho the validation fails for the form submit, its still executing the execute method.
my struts file
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- <include file="com/paritysys/util/struts.xml" /> -->
<constant name="struts.url.includeParams" value="none" />
<constant name="struts.action.extension" value="html,action" />
<package name="public" extends="struts-default">
<interceptors>
<interceptor name="websiteOnline"
class="parity.action.website.OnlineInterceptor" />
<interceptor name="websiteLogin"
class="parity.action.website.LoginInterceptor" />
<interceptor-stack name="appStack">
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<!-- <interceptor-ref name="paritySessionStack"/> -->
<interceptor-ref name="websiteOnline" />
<interceptor-ref name="websiteLogin" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="appStack" />
<global-results>
<result name="login" type="redirectAction">
<param name="actionName">index</param>
</result>
<result name="exception" type="freemarker">/public/error.html.ftl</result>
<result name="error" type="freemarker">/public/error.html.ftl</result>
<result type="freemarker" name="maintenance">/public/maintenance.html
</result>
<result type="freemarker" name="pre-offline">/public/pre-offline.html
</result>
<result type="freemarker" name="post-offline">/public/post-offline.html
</result>
</global-results>
<action name="index" class="parity.action.website.LoginAction">
<result type="freemarker" name="success">/public/index.html.ftl</result>
</action>
<action name="login" class="parity.action.website.SubmitLoginAction">
<result type="freemarker" name="success">/public/questionnaire.html.ftl
</result>
<result type="freemarker" name="input">/public/index.html.ftl</result>
</action>
<action name="submit" class="parity.action.website.SubmitQuestionnaireAction">
<result type="freemarker" name="success">/public/thanks.html.ftl
</result>
<result type="freemarker" name="input">/public/questionnaire.html.ftl
</result>
</action>
<action name="whereIsMyId" class="parity.action.website.LoginAction">
<result type="freemarker" name="success">/public/whereIsMyId.html.ftl
</result>
</action>
<action name="loadCollegeFinder" class="parity.action.website.LoadCollegeFinderAction">
<result type="freemarker" name="success">/public/college_finder.html.ftl
</result>
</action>
<action name="findCollege" class="parity.action.website.FindCollegeAction">
<result type="freemarker" name="success">/public/college_finder.html.ftl
</result>
<result type="freemarker" name="input">/public/college_finder.html.ftl
</result>
</action>
</package>
my action class code
public void validate() {
logger.debug("validate fired");
Bla bla bla
addFieldError("username","error");
if (hasFieldErrors()) {
logger.debug("Field errors is true");
}
}
public String execute() throws Exception {
logger.debug("execute firing");
return result;
}
any ideas why this would happen? for some reason even tho the login.action is failing, its still sending down the success return and moving forward.
You interceptor stack doesn't include the "workflow" interceptor stack, which is what determines what to do on a validation failure.
For that matter, it doesn't include the "params" interceptor, which is how parameters are set on the action, so it will never work anyway. You can't just arbitrarily remove interceptors--it's where S2 gets the bulk of its functionality. See the interceptor docs.
Also, you can set a default result type--you may want to do that if most everything is a FreeMarker result rather than type it over and over.
I am using struts2 and in my struts.xml I have written following code for locale switching -
<action name="switchToEnglish">
<interceptor-ref name="i18n"/>
<interceptor-ref name="basicStack"/>
<result name="input">error.jsp</result>
<result name="success">login.jsp</result>
</action>
<action name="switchToFrench">
<interceptor-ref name="i18n"/>
<interceptor-ref name="basicStack"/>
<result name="input">error.jsp</result>
<result name="success">login.jsp</result>
</action>
Now, after language switching same page (login.jsp) appears. But, I want to return on the page where user was before language switching.
Thanks in advance.
I had the same problem. I resolved it by passing the page name to the action(by GET or POST), then I use it in the result this way :
<action name="switchToEnglish">
<interceptor-ref name="i18n"/>
<interceptor-ref name="basicStack"/>
<result name="input">error.jsp</result>
<result name="success">%{currentPage}</result>
</action>
<action name="switchToFrench">
<interceptor-ref name="i18n"/>
<interceptor-ref name="basicStack"/>
<result name="input">error.jsp</result>
<result name="success">%{currentPage}</result>
</action>
Don't forget to set the getter/setter for "currentPage" in the action Class.
It's not the best way to do it but it was ok for my app.
Also I have made this, with an AJAX request to the LocaleAction, on success, just refresh the page with jQuery and you will stay on the same page where you was before the locale change.
script:
<script type="text/javascript">
$(document).ready(function(){
$(".lang").click(function() {
var id = $(this).attr("id");
$.ajax({
type: "POST",
url: "locale.action?lang="+id,
cache: false,
success: function(){
window.location.href='';
}
});
return false;
});
});
</script>
And the links:
<span style="float: right;">
<s:a id="ro" cssClass="lang">Română</s:a>
•
<s:a id="ru" cssClass="lang">Русский</s:a>
•
<s:a id="en" cssClass="lang">English</s:a>
</span>