Login và Logout trong Struts 2



Trước khi tạo ứng dụng login và logout bởi sử dụng Struts 2, bạn phải hiểu rõ khái niệm về Aware Interface trong Struts 2. Trong ví dụ dưới đây, chúng ta đã sử dụng SessionAware Interface để đặt thông tin trong phạm vi session và lớp ServletActionContext để lấy thông tin từ phạm vi session.

Ví dụ này gồm ba link là login, logout và profile. Người dùng cuối không thể click vào profile page cho tới khi anh ta đã đăng nhập vào. Sau khi đăng nhập, anh ta có thể tới trang profile này. Nếu người dùng cuối click vào trang logout page thì anh ta sẽ không thể truy cập profile page.

Giả sử rằng bạn có một bảng trong Oracle Database có tên là USER3333 gồm các bản ghi. Truy vấn bảng như sau:

CREATE TABLE  "USER3333" 
   (	"ID" NUMBER, 
	"NAME" VARCHAR2(4000), 
	"PASSWORD" VARCHAR2(4000), 
	"EMAIL" VARCHAR2(4000), 
	 CONSTRAINT "USER3333_PK" PRIMARY KEY ("ID") ENABLE
   )

Ví dụ tạo ứng dụng login và logout sử dụng Struts 2

Chúng ta tạo các page sau:

Tạo index.jsp

JSP page này tạo 3 link cho login, logout và profile.

<hr/>
<a href="login">login</a>|
<a href="logout">logout</a>|
<a href="profile">profile</a>

Định nghĩa action và result trong struts.xml

Xml file này định nghĩa một package và 4 action. Mỗi action định nghĩa ít nhất một result page. Với login và logout action, chúng ta sử dụng cùng lớp action như có phương thức khác nhau.

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD
 Struts Configuration 2.1//EN" 
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="abc" extends="struts-default">

<action name="login">
<result >login.jsp</result>
</action>

<action name="loginprocess" class="com.vietjack.Login">
<result name="success"  >loginsuccess.jsp</result>
<result name="error" >loginerror.jsp</result>
</action>

<action name="logout" class="com.vietjack.Login" method="logout">
<result name="success" >logoutsuccess.jsp</result>
</action>

<action name="profile" class="com.vietjack.Profile">
<result name="success" >profilesuccess.jsp</result>
<result name="error" >profileerror.jsp</result>
</action>

</package>
</struts>  

Tạo lớp action cho login và logout

Lớp action này triển khai SessionAware Interface và ghi đè phương thức setSession để lưu trữ thông tin trong phạm vi session.

Để logout, chúng ta gọi phương thức invalidate() của SessionMap.

Login.java

package com.vietjack;

import java.util.Map;
import org.apache.struts2.dispatcher.SessionMap;
import org.apache.struts2.interceptor.SessionAware;

public class Login implements SessionAware{
private String username,userpass;
SessionMap<String,String> sessionmap;

public String getUsername() {
	return username;
}

public void setUsername(String username) {
	this.username = username;
}

public String getUserpass() {
	return userpass;
}

public void setUserpass(String userpass) {
	this.userpass = userpass;
}

public String execute(){
	if(LoginDao.validate(username, userpass)){
		return "success";
	}
	else{
		return "error";
	}
}

public void setSession(Map map) {
	sessionmap=(SessionMap)map;
	sessionmap.put("login","true");
}

public String logout(){
	sessionmap.invalidate();
	return "success";
}

}

Tạo lớp Dao để xác nhận người dùng

Lớp này validate người dùng từ bảng được lưu trữ trong Oracle Database.

LoginDao.java

package com.vietjack;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class LoginDao {

public static boolean validate(String username,String userpass){
 boolean status=false;
  try{
   Class.forName("oracle.jdbc.driver.OracleDriver");
   Connection con=DriverManager.getConnection(
   "jdbc:oracle:thin:@localhost:1521:xe","system","oracle");
   
   PreparedStatement ps=con.prepareStatement(
     "select * from user3333 where name=? and password=?");
   ps.setString(1,username);
   ps.setString(2,userpass);
   ResultSet rs=ps.executeQuery();
   status=rs.next();
  }catch(Exception e){e.printStackTrace();}
 return status;
}
}
     
 

Tạo lớp Profile

Lớp này lấy thông tin từ phạm vi session, nếu có bất cứ thông tin nào được tìm thấy trong phạm vi session với tên đăng nhập, thì nó trả về success, nếu không trả về false.

Profile.java

package com.vietjack;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;

public class Profile {

public String execute(){
HttpServletRequest request=ServletActionContext.getRequest();
HttpSession session=request.getSession();

String s=(String)session.getAttribute("login");
if(s!=null && !s.equals("")){
	return "success";
}
else{
	return "error";
}

}
}

Tạo các thành phần view

Có nhiều thành phần view, đó là:

Thành phần view cho login

login.jsp: thành phần này tạo login form.

<jsp:include page="index.jsp"></jsp:include>
<hr/>
<%@ taglib uri="/struts-tags" prefix="s" %>

<s:form action="loginprocess">
<s:textfield name="username" label="Name"></s:textfield>
<s:password name="userpass" label="Password"></s:password>
<s:submit value="login"></s:submit>
</s:form>

loginsuccess.jsp: thành phần này tạo thông điệp welcome tới người dùng.

<jsp:include page="index.jsp"></jsp:include>
<hr/>
<%@ taglib uri="/struts-tags" prefix="s" %>

<br/>Welcome, <s:property value="username"/>

loginerror.jsp: thành phần này hiển thị thông điệp lỗi.

Xin loi, xay ra loi voi username hoac password ban nhap vao!!
<jsp:include page="login.jsp"></jsp:include>

Thành phần view cho logout

logoutsuccess.jsp: thành phần này tạo thông điệp đăng xuất thành công.

<jsp:include page="index.jsp"></jsp:include>
<hr/>
Ban da dang xuat thanh cong!

Thành phần view cho profile

profilesuccess.jsp: thành phần này tạo thông điệp Chao mung ban den voi profile.

<jsp:include page="index.jsp"></jsp:include>
<hr/>
<br/>Chao mung ban den voi profile

profileerror.jsp: thành phần này tạo thông điệp Vui long dang nhap de thay profile kèm theo trang login.jsp.

Vui long dang nhap de thay profile
<jsp:include page="login.jsp"></jsp:include>