posts - 36, comments - 30, trackbacks - 0, articles - 3

          nginx tomcat環境session不共享場景

          Posted on 2016-01-28 20:13 笑看人生 閱讀(3285) 評論(0)  編輯  收藏 所屬分類: Web開發技術
          @import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); 參照一下地址,搭建nginx tomcat的負載均衡環境

          新建一個簡單的web應用,實現簡單的登陸過程


          User java bean

           1 package com.xxx.yyy.entity;
           2 
           3 public class User {
           4     
           5     private String username;
           6     private String password;
           7     
           8     public String getUsername() {
           9         return username;
          10     }
          11     public void setUsername(String username) {
          12         this.username = username;
          13     }
          14     public String getPassword() {
          15         return password;
          16     }
          17     public void setPassword(String password) {
          18         this.password = password;
          19     }
          20         
          21 }
          22 


          登錄Servlet


           1 package com.xxx.yyy.servlet;
           2 
           3 import java.io.IOException;
           4 import javax.servlet.annotation.WebServlet;
           5 import javax.servlet.ServletException;
           6 import javax.servlet.http.HttpServlet;
           7 import javax.servlet.http.HttpServletRequest;
           8 import javax.servlet.http.HttpServletResponse;
           9 import javax.servlet.http.HttpSession;
          10 
          11 import com.xxx.yyy.entity.User;
          12 @WebServlet(name = "LoginServlet", urlPatterns = "/login.do")
          13 public class LoginServlet extends HttpServlet {
          14 
          15     @Override
          16     protected void doPost(HttpServletRequest req, HttpServletResponse resp)
          17             throws ServletException, IOException {
          18         
          19         
          20         String username = req.getParameter("username");
          21         String password = req.getParameter("password");
          22         
          23         User user = new User();
          24         user.setUsername(username.trim());
          25         user.setPassword(password.trim());
          26 
          27         if("root".equals(user.getUsername())&& "admin".equals(user.getPassword())) {
          28              HttpSession session = req.getSession();
          29              session.setAttribute("user", user);
          30             resp.sendRedirect("success.jsp");
          31         } else {
          32             resp.sendRedirect("failure.jsp");
          33         }
          34     }
          35 
          36 }
          37 


          登錄頁面index.jsp

           1 <%@ page language="java" contentType="text/html; charset=windows-31j"
           2     pageEncoding="windows-31j"%>
           3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
           4 <html>
           5 <head>
           6 <meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
           7 <title>Login Page</title>
           8 </head>
           9 <body>
          10     <form action="login.do" method="post">
          11     User Name:<input type="text" name="username"><br>
          12     Password:<input type="password" name="password"><br>
          13     <input type="submit">
          14     </form>
          15 </body>
          16 </html>
          17 


          登錄成功后,顯示的頁面 success.jsp

           1 <%@ page language="java" contentType="text/html; charset=windows-31j"
           2     pageEncoding="windows-31j"%>
           3 
           4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
           5 <html>
           6 <head>
           7 <meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
           8 <title>Login Success Page</title>
           9 </head>
          10 <body>
          11 Login Success<br>
          12     
          13         
          14     
          15     Username:${sessionScope["user"].username}
          16      <br>
          17     Password:${sessionScope["user"].username}
          18 
          19 </body>
          20 </html>
          21 


          登錄失敗后,顯示的頁面 failure.jsp

            1 <%@ page language="java" contentType="text/html; charset=windows-31j"

           2     pageEncoding="windows-31j"%>
           3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
           4 <html>
           5 <head>
           6 <meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
           7 <title>Login Failure Page</title>
           8 </head>
           9 <body>
          10 Login Failure
          11 </body>
          12 </html>
          13 


          Web應用新建完了之后,需要修改nginx.conf文件,修正內容如下:

          location ~ \.(jsp|do)$ { 

                      proxy_pass http://local_tomcats;

                      #root   html;

                      #index  index.html index.htm;

                  }

           

          由于我們servleturl是以.do結尾的,因此所有以.do結尾的請求都轉給Tomcat處理。

          修正之后運行nginx -s reload,重新加載配置文件

          實際運行效果如下:



          點擊“提交”按鈕,顯示如下頁面



          提示在success.jsp15行拋空指針異常。即如下代碼:

          Username:<%= user.getUsername()%>

           

          session對象中取出的usernull,為什么會出現這種情況。因為session對象是保存在tomcat服務器上的,session在兩臺tomcat之間沒有共享,導致了生成包含user對象的session在一臺服務器上,而獲取的session并不是包含user對象的session。訪問兩臺Tomcat的權重是一樣的

                   server localhost:8080 weight=1;

              server localhost:18080 weight=1;

          為了解決上面的問題,只是簡單修正一下nginx.conf文件,修正內容如下:


                 #server localhost:8080 weight=1;

                 #server localhost:18080 weight=1;

           

                  server localhost:8080;

                  server localhost:18080;

             ip_hash;

          修正之后運行nginx -s reload,重新加載配置文件

          實際運行效果如下:


          # nginx中的ip_hash將某個ip求定向到同一臺后端,這樣一來ip下的某個客端和某個后端就能建立起固的session


          當然解決session共享問題,還可以通過memcache來解決,后續文章會詳細介紹。














          主站蜘蛛池模板: 东山县| 阿拉善左旗| 昌江| 绥德县| 新营市| 福州市| 佳木斯市| 南投市| 丹凤县| 纳雍县| 元朗区| 贵南县| 边坝县| 兴文县| 邹城市| 霞浦县| 嵩明县| 台前县| 怀安县| 宣威市| 浮梁县| 耿马| 治县。| 奈曼旗| 美姑县| 永年县| 罗田县| 增城市| 新宾| 临汾市| 隆回县| 镇巴县| 玉门市| 高雄县| 宜川县| 什邡市| 文登市| 金乡县| 霍林郭勒市| 安图县| 锡林浩特市|