Struts2操作设置器方法不安全吗?

时间:2018-08-28 21:44:08

标签: jsp struts2

我有一个很奇怪的问题。 我有一个使用Struts2,两个动作文件和一个jsp文件构建的Web应用程序。 功能是提交表单并从UI获取csId。 但是,我发现如果打开两个窗口以单击表单以提交不同的csId,我可以看到该csId在操作循环中被更改了。

我认为操作是线程安全的,但是其他用户的操作如何在我的操作中更改csId? 请帮忙。

有两个动作文件:

public abstract class CustomerSegmentCrudBaseAction extends BaseAction {
    protected String csId;
    public String execute() throws PromotionException{
        return ActionSupport.SUCCESS;
    }

    public String getCsId() {
        return csId;
    }

    public void setCsId(String csId) {
        this.csId = csId;
    }
}

public class CustomerSegmentAddCustomerIdAction extends CustomerSegmentCrudBaseAction {

    public String execute(){ 
       for(int i = 0;i<10000;i++){
          log.info(java.lang.Thread.currentThread().getId() + " csId: " + csId);
       }
    }
}

jsp文件:

<s:form action="add-ids-customer-segment" method="post" enctype="multipart/form-data" onsubmit="var customerCount = getCustomerIdCount(); return confirm('Are you sure to upload ' + customerCount +' customers?');">
       <table><tbody><tr>
       <td class="cell">
           <s:textarea label="Customer ID" labelposition="false" id="csCustomerIds" name="csCustomerIds" value="" rows="2" cssClass="wide" theme="css_xhtml"/>
       </td>
       <td class="cell">
           <s:submit value="Add" theme="css_xhtml"/>
       </td>
       </tbody></table>
       <s:hidden name="csId" value="%{getCsId()}" />
   </s:form>

我还打印了线程ID,我可以看到有两个不同的线程。一个线程中的csId更改为另一个线程中的另一个csId。

2018年8月29日星期三10:55:40 GMT(http-bio-8663-exec-8)customeregment.ui.html.actions.edit.CustomerSegmentAddCustomerIdAction:线程ID为:44 csId:8787

2018年8月29日星期三10:55:40 GMT(http-bio-8663-exec-8)customeregment.ui.html.actions.edit.CustomerSegmentAddCustomerIdAction:线程ID为:44 csId:8787

2018年8月29日星期三10:55:40 GMT(http-bio-8663-exec-8)customeregment.ui.html.actions.edit.CustomerSegmentAddCustomerIdAction:线程ID为:44 csId:28475

2 个答案:

答案 0 :(得分:0)

我认为您确实将这个日志命令弄糊涂了。

Struts 2在单个线程中执行每个请求。 您的Logger是否打印当前线程ID以查看差异?

尝试也使用log.info(java.lang.Thread.currentThread().getId() + " csId: " + csId)记录当前线程ID。

答案 1 :(得分:0)

我发现根本原因是我使用Spring创建动作bean,默认情况下范围是单例。 将范围更改为原型。