【问题标题】:Java IE Gives Old HTTP Servlet Session ObjectJava IE 提供旧的 HTTP Servlet 会话对象
【发布时间】:2017-12-19 10:22:29
【问题描述】:

我正在为我的应用程序使用 IE 11。我在这里面临会话问题。

在进行第一次交易时,在交易响应 jsp 页面中,我得到当前交易没有说 1000 [(TransactionDO) session.getAttribute("txnDetails");]。 在同一个 jsp 中,我在 div 中执行了 ng-init="GetTxnResponse()",从该 js 函数获取事务编号为 1000。

然后我在没有注销的情况下使用同一会话进行第二次事务,在事务响应 jsp 页面中,我从 http 会话中获取当前事务编号为 1001。 在来自 ng-init="GetTxnResponse()" js 函数的同一 jsp 中,将事务编号设为 1000 而不是 1001。

它只出现在 IE 中。请帮忙解决。以下是我的代码供参考。

-- JSP代码--

<fmt:setLocale value='en_US' />
<%
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); 
// HTTP 1.1.
response.setHeader("Pragma","no-cache"); //HTTP 1.0 
response.setDateHeader ("Expires", 0); //prevents caching at the proxy server

TransactionDO txnDO = (TransactionDO) session.getAttribute("txnDetails");
System.out.println("Txn no : "+txnDO.txnNo()); // Here i get 1001 second time

%>

<fmt:bundle basename="applicationresources">
    <div ng-controller="txnController"
        ng-init="GetTxnResponse()" >
        ---
        --- 
    </div>
</fmt:bundle>

-- JS代码--

    self.GetTxnResponse = function() {
    if (txnStatus == '00') {
        $http.get(CONTEXT_PATH + '/getResponseDetails').success(function(data) {
        // Here i get 1000 from data second time
        }
    }   

-- Java 代码--

    @RequestMapping(value="/getResponseDetails", method=RequestMethod.GET)
    public @ResponseBody TransactionDO getResponseDetails(HttpServletRequest httpRequest){
    TransactionDO txnDO = null;
        txnDO = (TransactionDO) httpRequest.getSession().getAttribute("txnDetails");        
        return txnDO;
    }

【问题讨论】:

    标签: java angularjs jsp internet-explorer websphere


    【解决方案1】:

    使页面无状态。那是扎实的练习。它还允许在生产站点上进行缓存。

    <div ng-controller="txnController"
        ng-init="GetTxnResponse(${txnDetails.txnNo})" >
    
    self.GetTxnResponse = function(txnNo) {
        if (txnStatus == '00') {
            $http.get(CONTEXT_PATH + '/getResponseDetails/' + txnNo).success(function(data) {
            // Here i get 1000 from data second time
    
    @RequestMapping(value="/getResponseDetails/{txnNo}", method=RequestMethod.GET)
    public @ResponseBody TransactionDO getResponseDetails(HttpServletRequest httpRequest,
            @PathVariable long txnNo) {
        ...
    }
    

    您可能需要调整页面而不是显示的代码。

    再解释一下:用户可以打开同一个页面的两个选项卡,然后玩转。你猜怎么着?

    【讨论】:

    • 谢谢乔普。但我需要来自 txnDetails 对象的这么多字段。这就是为什么获取对象 getAttribute("txnDetails"),但 IE 提供旧会话对象。
    • 我的答案归结为在会话中有一个事务 ID 到事务的映射,并使用事务 ID 进行请求。那么就不会发生混淆。顺便说一句,一个快速的 IE 修复可能是添加到请求 URL "?t=" + System.currenMillis()
    • 非常感谢乔普。让我试试看。
    猜你喜欢
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多