@import url(http://m.tkk7.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;
}
由于我們servlet的url是以.do結尾的,因此所有以.do結尾的請求都轉給Tomcat處理。
修正之后運行nginx -s reload,重新加載配置文件
實際運行效果如下:

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

提示在success.jsp的15行拋空指針異常。即如下代碼:
Username:<%=
user.getUsername()%>
從session對象中取出的user為null,為什么會出現這種情況。因為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來解決,后續文章會詳細介紹。