記事のディレクトリ
メインコンテンツ:
csdnのアカウントにログインする場合は、ログイン後、ブラウザを閉じてください。しばらくしてからcsdnを再度開くと、アカウントがログインしていることがわかります。では、これはどのように達成されますか?次に実装しましょう。
アイデアとコード分析:
- まず、アカウントにログインする必要があります。ログイン後、ユーザー情報がセッションに保存されます。(セッションストレージを使用する目的は、後でブログを作成したり、ブログをブックマークしたりするときに、アカウントにログインしていることを確認することです)。
HttpSession session = request.getSession();
User user = userService.loginUser(username, password);
session.setAttribute("user",user);
- Cookieを使用してユーザーのセッション情報を保存するため、ブラウザを閉じてセッションに再度アクセスすると、現在のセッションは閉じる前のセッションと同じになり、元のセッション情報を取得できます。(セッションはサーバーに保存され、Cookieはブラウザに保存されます。セッションはCookieに依存します。セッションを作成すると、ブラウザはこのセッション全体を保存するためにキー名JSESSIONIDのCookieを生成します。 2番目のセッションの情報ですが、ブラウザを閉じるとJSESSIONIDの値が再割り当てされ、ブラウザを閉じる前のセッション情報を取得できません)。
//session.getId();此处的session就是对应上方的session
//获取登录账户的session
//session是服务器储存,但是当浏览器关闭,服务器不关闭时重新打开浏览器。两次的session不是同一个。所以需要通过cookie保留原来的session数据
Cookie userCookie = new Cookie("JSESSIONID",session.getId());
userCookie.setMaxAge(60*60);//我这里设置的存活时间为一个小时
response.addCookie(userCookie);
//获取用户名
Cookie usernameCookie= new Cookie("username",user.getUsername());
//获取密码
Cookie passwordCookie = new Cookie("password",user.getPassword());
//设置cookie存活一小时
usernameCookie.setMaxAge(60*60);
passwordCookie.setMaxAge(60*60);
//将cookie响应回去
response.addCookie(usernameCookie);
response.addCookie(passwordCookie);
我们这时候已经登陆了(第一次登录)。
我们把账号和密码也存到cookie里面,用于之后每次打开浏览器后的用户判断,判断浏览器是否存在我们的信息,从而决定我们是否需要重新登录账号
- この時点で、ブラウザを閉じてからブラウザを開くと、2回取得したセッションの値は同じであり、前のユーザーのアカウント情報がCookieに保存されています。次に、ログイン判定を行います。(例として私のプロジェクトのコードを取り上げてください)
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
//存放cookie信息的map集合
Map<String,String> cookieMap = new HashMap<>();
//获取之前存放的cookies的信息
Cookie[] cookies = request.getCookies();
//获取cookie
//1.先判断是否有cookie
if (cookies!=null&&cookies.length!=0){
System.out.println("有cookie信息,判断该用户");
for (Cookie cookie:cookies){
//2.往集合中存入用于用户名和密码判断的cookie值
if (cookie.getName().contains("username")||cookie.getName().contains("password")){
cookieMap.put(cookie.getName(),cookie.getValue());
}
}
//3.分别获取cookie存放的用户名和密码,用于验证(万一我要是修改了用户名密码,浏览器保存的是之前的,所以要先验证)
String username = cookieMap.get("username");
String password = cookieMap.get("password");
//进行数据库访问
User user =userService.loginUser(username, password);
//判断是否存在
if (user!=null){
//验证成功,直接登陆查看blog
System.out.println("用户信息已经存在,可以直接登陆了");
//既然数据库中有信息,说明验证成功,我就可以直接跳转到我的blog的页面了。
response.sendRedirect("/aishangboke/pageSearchServlet");
}
if (user==null){
//验证失败,重新登陆查看blog
//既然数据库中没有,说明验证失败,我就直接跳转到登陆页面重新登陆了。response.sendRedirect("/aishangboke/view/login.jsp");
}
} else{
//如果cookie的长度为0,说明浏览器中没有存放cookie或者存放的cookie信息已经过期,跳转到重新登陆页面
System.out.println("没有cookie信息,进行登陆");
response.sendRedirect("/aishangboke/view/login.jsp");
}
}
概要
コアログインケースのコード変換は上記のとおりです。
サーバーの実行中に、Cookieを判断するためのインターフェイスを作成できます。1。Cookieが存在しない場合は、ログインしていないことを意味します。ログインページにジャンプしてアカウントにログインできます。2. Cookieが存在する場合は、ログイン者情報の私のブログページ(例としてcsdnblogを取り上げます)に直接ジャンプして、ブログを直接表示できます。
後続のコードはCookieとは関係ありません。Cookieは、ここで2つの機能を果たしていると言っているのと同じです。1。前回のログインのセッション情報を格納します。2.アカウントのログインを判断します。
問題:
ログインユーザーのパスワードは安全ではないCookieに直接保存されますが、ユーザーのアカウントとパスワードは簡単に盗まれる可能性があるため、応答を暗号化する必要があります。暗号化操作は将来更新されます。