技術的な問題があり、正しい解決方法がわかりません:
私が開発している Web ページでは、アクションを「スタンプ」するために、セッション (ログインしている人) から現在のユーザー名を保存する必要があります。(たとえば、「ユーザーがこのファイルを作成した日」)。私のアルゴリズムはセッションからユーザー名を取得しますが、ユーザーごとに明らかに変化します。したがって、 は作成者名ではなく、常にログインしているユーザーのものです。
何かヒントはありますか?
ありがとう!
技術的な問題があり、正しい解決方法がわかりません:
私が開発している Web ページでは、アクションを「スタンプ」するために、セッション (ログインしている人) から現在のユーザー名を保存する必要があります。(たとえば、「ユーザーがこのファイルを作成した日」)。私のアルゴリズムはセッションからユーザー名を取得しますが、ユーザーごとに明らかに変化します。したがって、 は作成者名ではなく、常にログインしているユーザーのものです。
何かヒントはありますか?
ありがとう!
論理的には、これらはあなたが望むステップですか?
システムがデータを保存する部分 (データベースなど) が不足している可能性があると思います。
編集: 永続性が必要ない場合は、共有データを ServletContext に保存できます。これは深刻な解決策ではありませんが、簡単なプロトタイプやデモに使用できることに注意してください。本番環境でこれを行うことさえ考えないでください。問題があります。
サーブレットで次のようにします。
private static Map<String, FileData> fileAccess;
private class FileData {
String userName;
Date timeStamp = new Date();;
String fileName;
FileData(String userName, String fileName) {
this.userName = userName;
this.fileName= fileName;
}
}
public void init(ServletConfig config) {
String attributeKey = "fileAccess";
fileAccess = config.getServletContext().getAttribute(attributeKey);
if (fileAccess == null) {
fileAccess = new HashMap<String, FileData>();
config.getServletContext().setAttribute(attributeKey, fileAccess);
}
}
// in this example a POST means a user accesses a file
public void doPost(HttpServletRequest req, HttpServletResponse resp) {
// get the user name from the current session
String userName = req.getSession().getAttribute("userName");
// get the file name from the request (posted from the file access form)
String fileName = req.getParameter("fileName");
// check if we have the necessary data
if (userName == null || fileName == null) {
resp.getWriter().write("Invalid file access request");
resp.getWriter().flush();
return;
}
// create and fill file data wrapper
FileData fileData = new FileData(userName, fileName);
// store the file data in the shared fileAccess map.
// synchronized to block simultaneous acccess from different threads
synchronized (fileAccess) {
// note: any previously stored FileData object gets replaced
fileAccess.put(fileName, fileData);
}
// display the result to the user
display(fileData, resp);
}
// in this example a GET means a user views a file
public void doGet(HttpServletRequest req, HttpServletResponse resp) {
// get the file name parameter from the request (sent as part of the view-file request)
String fileName = req.getParameter("fileName");
// check if we have the necessary data
if (fileName == null) {
resp.getWriter().write("Invalid view file request.");
resp.getWriter().flush();
return;
}
// get the file data from the shared fileAccess map.
// synchronized to block simultaneous acccess from different threads
synchronized (fileAccess) {
FileData fileData = fileAccess.get(fileName);
// display the result to the user
display(fileData, resp);
}
}
private void display(FileData fileData, HttpServletResponse resp) {
resp.getWriter().write("File accessed:");
resp.getWriter().write("User: " + fileData.userName);
resp.getWriter().write("File: " + fileData.fileName);
resp.getWriter().write("Timestamp: " + fileData.timeStamp);
resp.getWriter().flush();
}