12

Java Web を学んでいますが、いくつか問題があり、助けが必要です。私は、header.jsp、footer.jsp、login.jsp (テンプレートの左側) および を含む template.jsp を使用し${param.content}.jspます。X.jsp という名前のページごとに、次の内容の別の JSP を作成しました。これは、各ページを同じレイアウトにするためです。

<jsp:include page="template.jsp">
    <jsp:param name="content" value="X"/>
    <jsp:param name="title" value="Start navigate"/>`enter code here`
</jsp:include>

たとえば、Review リンクをクリックすると、Review.jsp にリダイレクトされるようにしたいのですが、いくつか問題があります。footer.jsp には、次のようなものがあります。

(...)
< a href =" Review.jsp "> Review </a>
(...)

ログイン後、[レビュー] をクリックしようとすると、Review.jsp に移動しますが、ログインしていないことが示されます。Spring Framework、Tomcat 7、Eclipse、MySQL を使用しています。ログインすると、Cookie が作成されます。

String timestamp = new Date().toString();
String sessionId = DigestUtils.md5Hex(timestamp);
db.addSession(sessionId, username, timestamp);
Cookie sid = new Cookie("sid", sessionId);
response.addCookie(sid);

各メソッドについて、次のようなものがあります(チュートリアルでこれを見ました):

@RequestMapping(value = "/writeReview", method = RequestMethod.GET)
public String nameMethod(@CookieValue("sid") String sid,...)

sid を使用して、ユーザーが誰であるかを調べることができます。ユーザーのアカウントと他のいくつかのテーブルを含むデータベースがあります。問題は、レビューなどをクリックすると、ログインしていないと表示されることです。どうすればよいですか?

更新:
ユーザーと login.jsp に JavaBean を使用します。ログイン用のテキスト ボックスを持つ JSP には、ボタンをクリックしてログインするときに GET メソッドがあります。

@RequestMapping(value = "/login", method = RequestMethod.GET)
public ModelAndView createCookie(
  @RequestParam("username") String username, @RequestParam("password") String password,
  HttpServletRequest request, HttpServletResponse response) throws SQLException {
      //code for creating the cookie here, after testing if the user is in my database
}

ページごとに sid を送信し、モデルのユーザー名の属性を設定します。

public String methodName(@CookieValue(required = false) String sid, Model model) {
    if (sid != null) {
        User user = getUserBySid(sid);
        model.addAttribute("user", user);
    }
    (..other data.)
    return "nameJSP.jsp";
}

ユーザー名が空でない場合は、各 JSP をチェックインします。これにより、ユーザーがログインしているかどうかを確認できます。ヘッダーまたはフッターからのリンクをクリックしなければ、アプリケーションは正常に動作し、パラメーターを渡します。問題は、たとえば、レイアウトの実際のコンテンツである JSP から、フッターによって参照される JSP にパラメーターを渡す必要があることです。この JSP は、レイアウトの次のコンテンツになります。レイアウトはコンテンツとタイトルのみを認識します:

<title>${param.title}</title>
(I didn't paste all the code, I use a table <table>....)
<%@ include file="header.jsp"%>
<%@ include file="login.jsp"%>  
<jsp:include page="${param.content}.jsp"/> 
<%@ include file="footer.jsp"%>

では、別の JSP から受け取るパラメータをこの JSP に含めるにはどうすればよいでしょうか。また、layout.jsp からアクセスして、フッターまたはヘッダーに送信する必要がありますか?

<jsp:include page="layout.jsp">
    <jsp:param name="content" value="X"/>
    <jsp:param name="title" value="Start navigate"/>
</jsp:include>
4

2 に答える 2

15

インクルードされた JSP にいくつかのパラメーターを渡すには、次のようにします。

<jsp:include page="somePage.jsp" >
    <jsp:param name="param1" value="someValue" />
    <jsp:param name="param2" value="anotherParam"/>
    ....
</jsp:include>

あなたはすでにそれをやっています。

OK、質問の詳細はあまり明確ではありませんが、わかりました。
解決策の 1 つとして、次のことが考えられます。

Loginアクションで、認証が成功した場合は、HttpSession を作成し、認証さUserの属性を設定します。

if (/* authentication was successfull */) {
    request.getSession().setAttribute("loggedInUser", user);
    ...
}

また、ユーザーがログインしているかどうかを制御しているコードでは、適切なHttpSession属性の存在を確認してください。

HttpSession session = request.getSession(false);
if (session == null || session.getAttribute("loggedInUser") == null) {
    // user is not logged in, do something about it
} else {
    // user IS logged in, do something: set model or do whatever you need
}


または、JSP ページで、次の例で BalusC が示すように、ユーザーがJSTLタグ を使用してログインしているかどうかを確認できます

...
<c:if test="${not empty loggedInUser}">
    <p>You're still logged in.</p>
</c:if>
<c:if test="${empty loggedInUser}">
    <p>You're not logged in!</p>
</c:if>
...

フィルターで救助

ただし、通常、ユーザーがログインしているかどうかを確認して、一部のページへのアクセスを制限します (認証されたユーザーのみがアクセスできるようにします)。そして、 javax.servlet.Filterを実装するいくつかのクラスを作成します。

私のプロジェクトの 1 つからの LoginFilter の例を次に示します。

package com.example.webapp.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * The purpose of this filter is to prevent users who are not logged in
 * from accessing confidential website areas. 
 */
public class LoginFilter implements Filter {

    /**
     * @see Filter#init(FilterConfig)
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}

    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        HttpSession session = request.getSession(false);
        if (session == null || session.getAttribute("loggedInUser") == null) {
            response.sendRedirect(request.getContextPath() + "/login.jsp");
        } else {
            chain.doFilter(request, response);
        }
    }


    /**
     * @see Filter#destroy()
     */
    @Override
    public void destroy() {}

}

このプロジェクトでは、Spring を使用せずにプレーンなサーブレットと JSP を使用しましたが、アイデアは理解できるでしょう。

もちろん、このフィルターを使用するにはweb.xmlを構成する必要があります。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">
    ...
    <filter>
        <filter-name>Login Filter</filter-name>
        <filter-class>com.example.webapp.filter.LoginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>Login Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    ...
</web-app>


:サーブレット バージョン 3.0 以降をサポートするWeb コンテナーまたはアプリケーション サーバー
を 使用している場合は、フィルター クラスに@WebFilterアノテーションを付けることができます。この場合、デプロイメント記述子( web.xml )でフィルターを構成する必要はありません。. @WebFilterアノテーションの使用例と、フィルター関連の詳細情報はこちらを参照してください。

これがあなたを助けることを願っています。

于 2013-01-03T09:46:14.960 に答える
-1

または、次を使用します。

String username = request.getRemoteUser();
于 2015-12-30T14:46:40.237 に答える