私は学習しています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.jspにリダイレクトしたいのですが、いくつか問題があります。 footer.jspには、次のようなものがあります。
(...)
< a href =" Review.jsp "> Review </a>
(...)
ログイン後、[レビュー]をクリックしようとすると、Review.jspに移動しますが、ログインしていないことが示されます。SpringFramework、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を使用して、誰がユーザーであるかを知ることができます。ユーザーのアカウントと他のいくつかのテーブルを含むデータベースがあります。問題は、レビューなどをクリックすると、ログインしていないことが表示されることです。どうすればよいですか?
[〜#〜] update [〜#〜]:
ユーザーと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>
含まれているJSPにいくつかのパラメータを渡すには:
<jsp:include page="somePage.jsp" >
<jsp:param name="param1" value="someValue" />
<jsp:param name="param2" value="anotherParam"/>
....
</jsp:include>
あなたはすでにそれをやっています。
質問の詳細はあまり明確ではありませんが、私にはわかります。
解決策の1つは次のようになります。
Loginアクションで、if認証が成功した場合は、HttpSessionを作成しますそして認証されたユーザーの属性を設定します:
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を使用しましたが、理解できるでしょう。
そしてもちろん、このフィルターを使用するには、mustconfigureweb.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アノテーションおよびその他のフィルター関連情報の使用例を参照してください ここ 。
これがお役に立てば幸いです。