テクノロジーよりもロジックに関連する問題があります。これがシナリオです(Spring + Hibernateを使用しています)
getリクエストごとにページに戻るには、データベースからデータを読み取る必要がありますが、スクリプトを使用して誰かがページを頻繁にリロードすると、サーバーへの呼び出しが多くなると思いました。データを読み取り、グローバル変数またはクラス変数に入れます。そうすることで、非常に奇妙なコードを多くのグローバル変数と愚かな方法で記述して、変数userのように初期値を与えることになります-私が与えたバイト型変数であるステータス- 2を初期値として使用して、内部ロジックがデータベースからこの変数に値が設定されていないことを理解できるようにします。以下は私のコードです
@Controller
/* @Secured("hasRole('ROLE_USERS')") */
@RequestMapping("member")
public class ApplyRoles {
@Autowired
private UserInformationForAccessApplication checkUserStatus;
// we will initialize variables to avoid auto-initialize by constructor
private byte userStatus = Constant.IntializationOfGlobalVariable.GLOBALINIT,
requesttype = Constant.IntializationOfGlobalVariable.GLOBALINIT,
access = Constant.IntializationOfGlobalVariable.GLOBALINIT;
Map<String, Object> accessnrole;
Map<String, String> country;
Map<String, String> roleArray;
@Autowired
StudentEnrollmentApplication enrollmentApplication;
@Autowired
SystemProperties systemProperties;
@Autowired
EmployeeEnrollmentApplicationResume employeeEnrollmentApplicationResume;
@Autowired
AccessEnrollmentProcessing accessEnrollmentProcessing;
private String role = Constant.IntializationOfGlobalVariable.ROLENOTSET,
fname, lname;
@RequestMapping(value = "/user", method = RequestMethod.GET)
public String checkingUserStatus(Model model, HttpSession session,
Authentication authentication) {
String sessionemail = "yashprit@gmail.com";// (String) session
// .getAttribute(Constant.SessionAttributes.LOGGEDINUSER);
// first check global value, if found set than don't fetch from database
if (userStatus == Constant.IntializationOfGlobalVariable.GLOBALINIT) {
// get user status from MySQL Database
userStatus = checkUserStatus.checkStatus(sessionemail).get(0);
if (!(userStatus == Constant.UserRoleApplicationStatus.NOTAPPLIED)) {
access = checkUserStatus.checkStatus(sessionemail).get(1);
model.addAttribute(Constant.SystemName.ACCESS, access);
}
}
if (!(userStatus >= Constant.UserRoleApplicationStatus.NOTAPPLIED || userStatus <= Constant.UserRoleApplicationStatus.REJECTED)) {
model.addAttribute("error", "User status is not avaible");
return "redirect:error/pagenotfound";
} else if (userStatus == Constant.UserRoleApplicationStatus.NOTAPPLIED) {
if (requesttype == Constant.IntializationOfGlobalVariable.GLOBALINIT) {
// get request type from MongoDB database
requesttype = checkUserStatus.getRequestType(sessionemail);
}
if (!(requesttype == Constant.RequestType.NORMALEBIT || requesttype == Constant.RequestType.INVITEBIT)) {
model.addAttribute("error",
"Facing Technichal Issue, Please try again");
return "redirect:error/pagenotfound";
}
if (requesttype == Constant.RequestType.INVITEBIT) {
if (!(Byte.parseByte((String) accessnrole
.get(Constant.SystemName.ACCESS)) == Constant.Access.USERBIT)) {
accessnrole = checkUserStatus
.getAccessAndRole(sessionemail);
}
if (accessnrole.get(Constant.SystemName.ACCESS).equals(
Constant.Database.ERRORMESSAGE)
|| accessnrole.get(Constant.SystemName.ROLE).equals(
Constant.Database.ERRORMESSAGE)) {
model.addAttribute("error",
"Facing Technichal Issue, Please try again");
return "redirect:error/pagenotfound";
}
model.addAttribute(Constant.SystemName.ACCESSNROLE, accessnrole);
model.addAttribute(Constant.SystemName.REQUESTTYPE, requesttype);
}
}
model.addAttribute(Constant.SystemName.USERSTATUS, userStatus);
return "member/user";
}
}
グローバル変数を回避するために、Cookieを使用することを考えました。これは、データベースを呼び出す必要がない場合よりも、セッションでロードされた後、同じセッションでページがリロードされるたびにデータベースを呼び出したくないためです。
コードの上記の部分を再設計するのに役立つものは何でも大歓迎です
ありがとう