JSP: Как проверить, вошел ли пользователь в систему?

Я изучаю Java Web, но у меня есть некоторые проблемы, и мне нужна помощь. Я использую шаблон.jsp, в который я включаю заголовок.jsp, нижний колонтитул.jsp, вход.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>

когда я нажимаю на ссылку обзора, например, я хочу перенаправить на обзор.JSP, но у меня есть некоторые проблемы. В нижняя сноска.jsp у меня есть что-то вроде этого:

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

после входа в систему я пытаюсь нажать обзор, он отправляет меня в обзор.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, я могу узнать, кто пользователь. У меня есть база данных с учетной записью пользователя и некоторые другие таблицы. Проблема в том, что когда я нажимаю обзор или любой другой, он показывает мне, что я не вошел в систему. Что я могу сделать?

обновление:
Я использую JavaBean для пользователя и входа в систему.JSP-страница. 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? Кроме того, он должен быть доступен по макету.jsp и отправляется в нижний колонтитул или в верхний колонтитул?

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

2 ответов


чтобы передать некоторые параметры включенному JSP:

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

вы уже делаете это.

хорошо, детали вопроса не очень ясны, но я понимаю идею.
Одним из решений может быть следующее.

в своем логин действий, если аутентификация прошла успешно, create 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 вы можете проверить, вошел ли пользователь в систему с помощью тегов JSTL теги, как показано BalusC в Примере здесь:

...
<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.сервлет.Фильтр.

вот пример 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() {}

}

в этом проекте я использовал простые сервлеты и JSP без Spring, но вы получите идею.

и конечно, вы должны настроить 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 и выше, то вы можете аннотировать свой класс фильтра с @WebFilter Аннотация В этом случае нет необходимости настраивать фильтр в дескриптора развертывания (web.в XML). См. пример использования @WebFilter аннотация и дополнительная информация, связанная с фильтром здесь.

надеюсь, это поможет вам.


или просто использовать:

String username = request.getRemoteUser();